我正在使用 PHP 和 pcntl_fork()。其思想是父进程分叉并暂停以等待子进程完成;子进程执行任务然后终止;父进程可以检查任务的返回代码或子进程的状态并继续执行。
(通过分叉将任务与主父进程隔离,以确保如果任务遇到无法捕获的运行时问题(例如损坏的“包含”文件或缺少关键库),父进程可以很好地进行清理,因此进行分叉,基本上我正在实现简单的进程隔离,以防在罕见的情况下,无法捕获的情况可能会导致问题)
因此问题是,在 pcntl_fork() 之后,两个进程共享相同的 STDXXX I/O 描述符,因此,一旦子进程完成其任务,它正在使用的 I/O 就会照常关闭,因此父进程也会关闭,这意味着用于继续与父进程交互的 echo() 之类的东西也会突然停止工作。
我按照 php.net 上的提示,在子进程中使用 posix kill -9 而不是 exit,这样子进程终止时就不会关闭与父进程共享(并且父进程需要)的 IO,但是有没有更简洁的方法来做到这一点?
谢谢!
答案1
在执行之前,您可以通过打开例如和或 来pcntl_fork()
“复制”文件所需的文件描述符。请参阅 phpphp://stdout
php://stderr
php://fd/3
协议。
请注意,当子进程关闭文件描述符时,它不是在父进程中关闭。在 fork 之后,进程共享相同的指针打开文件,但在子进程退出后,您仍然可以从父进程回显。