基于此 SO帖子和此示例,我希望当我使用 fork() 时,将允许我以非阻塞方式执行 system/execvp。但是,当我尝试在上述示例代码中的 fork 块中发出一个长时间运行的子进程时,控件不会返回到父块,直到子进程完成。
你能告诉一个方法,我应该如何设计代码以允许在 C/C++ 代码中对系统进行非阻塞调用。另外,我计划编写一个程序,其中不止一个孩子来自同一个父母。我怎样才能得到孩子的pid?
谢谢你的帮助。
fork
将立即返回给孩子和父母。但是,该示例 (test3.c) 调用wait4
,就像听起来一样,等待另一个进程执行某些操作(在本例中为退出)。
提到的示例代码在产卵后等待孩子返回 - 这就是它阻塞的原因。
要获取子进程的 pid,请使用 fork() 的返回值。fork() 是单个系统代码,它返回两个不同的值 - 子进程的 pid 到父进程和 0 到子进程。这就是为什么您可以区分程序中应该由父母和孩子执行的代码块的原因。
请参阅 man fork(2)。
关于 fork() 和 wait() 你可能应该注意的另一件事是,在子进程退出后,内核仍然保存一些关于它的信息(例如退出状态),这些信息应该以某种方式使用。否则,这样的过程将成为“僵尸”(ps 输出中的 Z)。这是通过 wait*() 调用完成的工作。此外,在子进程退出后,内核会使用 SIGCHLD 通知其父进程。如果您不想处理子返回值,您可以通知系统您将使用 signal()、sigaction() 等来忽略 SIGCHLD。在这种情况下,会自动获得额外的数据。这种行为可能是您系统上的默认行为,但仍建议您明确声明此类行为以提高程序的可移植性。