Windows 分叉时为负的子pid

Windows 分叉时为负的子pid,windows,perl,fork,strawberry-perl,Windows,Perl,Fork,Strawberry Perl,因此,我知道Windows不支持Unix fork exec模型,而是生成进程。然而,草莓Perl的fork仿真生成具有负PID的子级。这些PID看起来是一致的,但我不明白为什么它们是负面的,或者说,Perl是如何模拟Unix fork的 use strict; use warnings; my $cpid = fork(); if ($cpid == 0) { printf "%s\n", "I'm the child, pid is $$"; } else { print

因此,我知道Windows不支持Unix fork exec模型,而是生成进程。然而,草莓Perl的fork仿真生成具有负PID的子级。这些PID看起来是一致的,但我不明白为什么它们是负面的,或者说,Perl是如何模拟Unix fork的

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

大部分细节都在中,但为了回答您的特定问题,Windows上Perl的伪进程实际上是作为线程实现的。您应该将正PID解释为原始线程的实际PID,而负PID实际上是线程ID(当然是否定的)。

大部分细节都在中,但为了回答您的特定问题,Windows上Perl的伪进程实际上是作为线程实现的。您应该将正PID解释为原始线程的实际PID,而负PID实际上是线程ID(当然是否定的)。

如果正PID用于由
fork创建的伪进程(实际上是线程),它们可能与实际进程的PID冲突。

如果正PID用于由
fork
创建的伪进程(实际上是线程),则它们可能与实际进程的PID冲突。

“您应该将正PID解释为原始线程的实际PID,而负PID实际上是线程ID”这在任何地方都有记录吗?我读过perlfork,不知道负数是从哪里来的,只是
wait
会发生一些神秘的事情,如果你得到一个-1的伪pid,“你应该将一个正pid解释为原始线程的实际pid,而负pid实际上是线程ID”这有记录吗?我读过perlfork,不知道负数是从哪里来的,只有当你得到-1的伪pid时,
wait
会发生神秘的事情