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

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

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

谢谢你的帮助。

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

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

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

参考man fork(2)。

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