为什么fork()不会立即给出正确的pid?

时间:2014-11-28 13:15:03

标签: linux bash perl

当我跑步时

#!/usr/bin/perl
my $pid;
if ($pid = fork) {
    system("sleep 100");
}
print "pid $pid\n";

然后我得到

pid 0

退出时

pid 17613

当它正在运行时,我可以看到子进程ID的

jasl     17612 17036  0 14:05 pts/2    00:00:00 /usr/bin/perl ./fork.pl
jasl     17613 17612  0 14:05 pts/2    00:00:00 [fork.pl] <defunct>
jasl     17614 17612  0 14:05 pts/2    00:00:00 sleep 100

问题

为什么我首先获得pid 0(fork成功),然后退出正确的pid 17613?好像print行被执行了两次?

有没有办法从perl脚本中获取sleep命令的PID?

2 个答案:

答案 0 :(得分:3)

  

如果打印行被执行两次?

我建议您在使用fork之前先了解fork()的作用。 然后你就会明白为什么这条线被执行了两次。

简而言之:fork创建当前进程的副本,然后在这两个进程上运行其余代码。一个主要的区别是来自孩子的返回代码是0,而来自父母的返回代码是孩子的pid。

答案 1 :(得分:2)

Fork为两个进程返回不同的PID。父进程接收子进程的PID,并向子进程返回0。因此,您看到两次打印的原因是因为两个进程都打印了返回给它们的值。