【问题标题】:non-blocking system call in c++ program using fork使用fork的c ++程序中的非阻塞系统调用
【发布时间】:2012-04-21 10:27:02
【问题描述】:

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

你能告诉一个方法,我应该如何设计代码以允许在 C/C++ 代码中对系统进行非阻塞调用。另外,我计划编写一个程序,其中不止一个孩子来自同一个父母。如何获取孩子的pid?

感谢您的热心帮助。

【问题讨论】:

  • 请添加一些代码来说明你在做什么。

标签: c++ c system fork pid


【解决方案1】:

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

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

参考 man fork(2)。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢。这解决了这个问题。你能告诉我,如果我必须发出许多进程,同样的 fork 方法是否可行。另外,当我使用 fork 获取子进程的 pid 时,它给出 0。我怎样才能获得正确的 pid?
    • 这就是 fork 的工作原理。它将子进程的 PID 返回给父进程,将零返回给子进程。如果这没有发生,则没有(简单的)方法可以判断哪个过程是哪个过程。基本上,如果您需要自己的 PID,则必须以通常的方式获取它,我现在不记得了,但我相信您可以查找它。
    • @user984260 fork 返回父进程中新进程的 PID。在子进程中,它返回 0。要获取当前进程的 PID,您可以调用 getpid。手册页是您的朋友!
    • fork 视为进行克隆的系统调用。 (事实上​​,现在在一堆系统中,一个名为 clone 的系统调用,fork 只是它的一个特例。)原本的。原来只是叫fork,所以克隆也只是叫fork。原版和克隆版如何知道哪个是哪个?答案:fork 在原始中返回克隆的 ID,在克隆中返回 0。克隆将如何找到他的新 pid?调用“get me my pid”系统调用,getpid
    猜你喜欢
    • 2012-06-19
    • 2018-06-11
    • 1970-01-01
    • 2012-02-02
    • 2011-08-27
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2014-07-15
    相关资源
    最近更新 更多