2015-11-02 48 views
0

所以我明白,Windows不支持Unix fork-exec模型,而是产生进程。但是,Strawberry Perl的fork仿真产生负PID的儿童。这些PID似乎是一致的,但我不明白为什么它们是否定的,或者真的,Perl如何模拟Unix分支。草莓Perl负面孩子PID分叉时

use strict; 
use warnings; 

my $cpid = fork(); 

if ($cpid == 0) { 
    printf "%s\n", "I'm the child, pid is $$"; 
} else { 
    printf "%s\n", "I'm the parent, pid is $$, cpid is $cpid"; 
} 

这将产生类似于:

I'm the parent, pid is 3428, cpid is -2600 
I'm the child, pid is -2600 

回答

4

大部分的细节都在perlfork,但回答您的具体问题,在Windows伪过程对Perl实际上是作为线程来实现。你应该把一个肯定的PID解释为原始线程的实际PID,而负的PID实际上是线程ID(当然是否定的)。

+0

“您应该将正PID解释为原始线程的实际PID,否定PID实际上是线程ID”这是否记录在任何位置? – ThisSuitIsBlackNot

+0

我读了perlfork,不知道负数是从哪里来的,只有那些神秘的事情发生在用'wait',如果你得到一个伪pid为-1 –

2

如果对fork(实际上是线程)创建的虚拟进程使用了​​正向PID,则它们可能与实际进程的PID冲突。