使用 fork 在 C++ 程序中进行非阻塞系统调用
non-blocking system call in c++ program using fork
基于这个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。在这种情况下,会自动获取其他数据。此类行为可能是系统上的默认行为,但仍建议您明确声明此类行为以提高程序的可移植性。
相关文章:
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 如何将C++系统调用连接到 freertos
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 系统调用:一次和多次,哪个更好?
- 使用路径和空格的系统调用
- 是否有等效于 macOS 上的 clone() 系统调用?
- 从C++调用系统调用节点?
- C++测试程序中的非法系统调用(对角矩阵元素程序的总和)
- 英特尔 Pin:如何获取系统调用的返回地址
- 如何使用低级系统调用从 stdin 和输入文件中获取字节数
- 使用模拟器C++从RISC-V裸机程序调用printf系统调用时失败
- 动态执行的 ARM ASM 系统调用,可从C++重新定位
- 如何知道我正在使用的Linux OS是否具有特定的系统调用
- 当C 中的系统调用conconculables时,参数字符串中的字符损失
- 如何使用gmock框架模拟c++单元测试中的fork和execlp系统调用
- 使用 fork 在 C++ 程序中进行非阻塞系统调用
- C++-在代码块中使用系统调用(fork、exec、wait等)
- fork and wait系统调用出现问题
- C系统调用pipe, fork和execl