当我跑步时
#!/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?
答案 0 :(得分:3)
如果打印行被执行两次?
我建议您在使用fork之前先了解fork()的作用。 然后你就会明白为什么这条线被执行了两次。
简而言之:fork创建当前进程的副本,然后在这两个进程上运行其余代码。一个主要的区别是来自孩子的返回代码是0,而来自父母的返回代码是孩子的pid。
答案 1 :(得分:2)
Fork为两个进程返回不同的PID。父进程接收子进程的PID,并向子进程返回0。因此,您看到两次打印的原因是因为两个进程都打印了返回给它们的值。