perl exec何时导致PID切换?[已关闭]

9fkzdhlc  于 2023-01-13  发布在  Perl
关注(0)|答案(2)|浏览(141)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
2天前关闭。
Improve this question
我老板几年前用Perl写了一些代码(我知道这是危险的领域),现在它引起了一个问题-PID更改,因此pidfile不再有效。代码:

exec($0, "-f", "$configfile")
  • 我 * 认为可能有一个shell调用涉及到派生$0(可能是克隆),但他1000%肯定没有涉及到shell。对于上面的代码,另一个进程(不同的PID)而不是同一PID中的实际执行程序,是否有其他解释?

顺便说一句

exec("exec", $0, "-f", "$configfile")

运行良好(执行的进程具有与执行函数调用之前相同的PID)。
还有,如果涉及到空壳,我怎么向他证明是这样呢?

watbbzwu

watbbzwu1#

当你传递多个参数给systemexec时,没有shell被使用。这个约定在Windows上被打破了,在Windows上,如果程序没有shell就不能执行,那么就使用shell。
当你使用块形式的systemexec时,没有使用shell,甚至在Windows上也没有。
评论中提到exec创建了一个新进程,但事实并非如此(Windows之外)。

#!/usr/bin/perl

use v5.14;

say "$$ @ARGV";

if ( !@ARGV ) {
   exec( $^X, "--", $0, "foo" )
      or die "exec: $!";
}
$ ./a
865
865 foo
pexxcrt2

pexxcrt22#

没有fork,因为exec接收3个参数。
如果LIST中有多个参数,则使用LIST中的参数调用execvp(3

相关问题