Strawberry Perl отрицательный дочерний pid при разветвлении

Итак, я понимаю, что Windows не поддерживает модель Unix fork-exec и вместо этого порождает процессы. Однако эмуляция вилки Strawberry Perl создает дочерние элементы с отрицательными PID. Эти PID кажутся непротиворечивыми, но я не понимаю, почему они отрицательные или, на самом деле, как Perl эмулирует форк Unix.

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

person Gregory Nisbet    schedule 02.11.2015    source источник


Ответы (2)


Большая часть деталей находится в perlfork, но чтобы ответить на ваши конкретные вопросы, см. Псевдопроцессы для Perl на Windows на самом деле реализована как потоки. Вы должны интерпретировать положительный PID как фактический PID исходного потока, а отрицательные PID - это фактически идентификаторы потока (конечно, отрицательные).

person tjd    schedule 02.11.2015
comment
Положительный PID следует интерпретировать как фактический PID исходного потока, а отрицательный PID — как фактический идентификатор потока. Это где-нибудь задокументировано? - person ThisSuitIsBlackNot; 03.11.2015
comment
Я читал perlfork и не мог сказать, откуда берутся отрицательные числа, только то, что с wait происходят загадочные вещи, если вы получаете псевдо-pid, равный -1. - person Gregory Nisbet; 03.11.2015

Если положительные PID использовались для поддельных процессов, созданных fork (которые на самом деле являются потоками), они могли конфликтовать с PID реальных процессов.

person ikegami    schedule 03.11.2015