基于此SO 交 ,这例如 ,我期望的是,当我使用fork(),将允许我执行系统/ execvp在非阻塞方式。 然而,当我尝试在上述示例代码叉子块发出长时间运行的子进程,控制不返回到父块,直到孩子完成。
你能告诉的方法,我应该如何设计代码,允许非阻塞系统调用,在C / C ++代码。 另外,我打算写一个程序,一个以上chidren是从同一个父分叉。 我怎样才能得到孩子的PID?
感谢您的热心帮助。
基于此SO 交 ,这例如 ,我期望的是,当我使用fork(),将允许我执行系统/ execvp在非阻塞方式。 然而,当我尝试在上述示例代码叉子块发出长时间运行的子进程,控制不返回到父块,直到孩子完成。
你能告诉的方法,我应该如何设计代码,允许非阻塞系统调用,在C / C ++代码。 另外,我打算写一个程序,一个以上chidren是从同一个父分叉。 我怎样才能得到孩子的PID?
感谢您的热心帮助。
fork
将立即返回到子和父两者。 然而,例如(test3.c)调用wait4
,这就像它的声音,等待另一个进程做一些事情(在这种情况下退出)。
提到示例代码等待孩子产卵后返回 - 这就是为什么它会阻止。
要获得子进程的PID,使用fork的返回值()。 叉()是单一的系统代码,它返回两个不同的值 - 孩子的PID到父进程和0至子进程。 这就是为什么你可以在你的程序应该由家长和孩子要执行区分代码块。
请参阅男人叉(2)。
你应该注意有关fork()和wait()的另一件事是,后子进程退出内核仍持有一些关于它的信息(例如,退出状态),应以某种方式消耗掉。 否则这样的方法将成为“僵尸”(单位为ps输出Z)。 与等待*()完成这是工作需要。 此外,孩子离开后,其母公司通过与SIGCHLD内核通知。 如果你不想处理孩子返回值,你可以通知你会忽略与信号SIGCHLD()系统的sigaction(),等。在这种情况下,额外的数据将被自动关闭收获。 这样的行为可能是您的系统默认的,但你说出这样的行为明确,以提高程序的可移植性仍然adviseable。