解释了如何在使用Perl的exec()时获得新进程的pid。pid甚至没有改变,所以您所需要做的就是获得原始脚本的pid。但是,如果我将输出作为命令的一部分重定向到一个文件,这是行不通的,我需要这样做。
say "my pid is $$";
exec("childscript.pl"); # same pid
但是,如果我将输出重定向为命令的一部分:
say "my pid is $$";
exec("childscript.pl > log.txt"); # differe
我有一个while循环,它通过将子进程的stdout重定向到父进程,从而使用阻塞I/O从子进程读取数据。通常,子进程一退出,在这种情况下阻塞的read()就会返回,因为被读取的管道由子进程关闭。
现在,我有一种情况,即对于已完成的子进程,read()调用不会退出。子进程以僵尸状态结束,因为操作系统正在等待我的代码获得它,但是我的代码却阻塞了read()调用。
子进程本身在挂起时没有运行任何子进程,我在查看/proc/<child process PID>/fd时没有看到列出的任何文件描述符。然而,子进程确实分出了两个守护进程,其目的似乎是监视子进程(子进程是一个专有的应用程序,我没