使用 fork 在 C++ 程序中进行非阻塞系统调用

non-blocking system call in c++ program using fork

本文关键字:系统调用 fork C++ 程序 使用      更新时间:2023-10-16

基于这个SO帖子和这个例子,我希望当我使用fork()时,将允许我以非阻塞方式执行system/execvp。但是,当我尝试在上述示例代码中的 fork 块中发出长时间运行的子进程时,控件不会返回到父块,直到子块完成。

你能告诉一个方法,我应该如何设计代码以允许在 C/C++ 代码中对系统进行非阻塞调用。另外,我计划编写一个程序,其中多个孩子是从同一个父级分叉出来的。我怎样才能得到孩子们的pid?

感谢您的帮助。

fork将立即返回到子项和父项。 但是,该示例(test3.c)调用wait4,就像听起来一样,等待另一个进程执行某些操作(在本例中为退出)。

提到的示例代码在生成后等待子项返回 - 这就是它阻塞的原因。

要获取子进程的 pid,请使用 fork() 的返回值。fork() 是单个系统代码,它返回两个不同的值 - 子进程到父进程的 pid 和子进程的 0。这就是为什么您可以区分程序中应由父项和子项执行的代码块的原因。

参考人叉(2)。

关于

fork()和wait(),你可能应该注意的另一件事是,在子进程退出后,内核仍然保存着一些关于它的信息(例如退出状态),这些信息应该以某种方式消耗。否则,这样的过程将成为"僵尸"(ps输出中的Z)。这是通过 wait*() 调用完成的工作。此外,在子级退出后,内核会通知其父级与 SIGCHLD。如果你不想处理子项返回值,你可以通知系统你将用 signal()、sigaction() 等忽略 SIGCHLD。在这种情况下,会自动获取其他数据。此类行为可能是系统上的默认行为,但仍建议您明确声明此类行为以提高程序的可移植性。