使用fork在c ++程序中调用非阻塞系统

时间:2012-04-08 21:16:44

标签: c++ c system fork pid

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

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

fork将立即返回给孩子和父母。但是,该示例(test3.c)调用wait4,就像听起来一样,等待另一个进程执行某些操作(在这种情况下退出)。

答案 1 :(得分:1)

提到的示例代码等待孩子在产卵后返回 - 这就是它阻止的原因。

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

参考man fork(2)。

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