父进程如何等待所有子进程完成然后在收到 SIGINT 时退出?

发布于 2024-12-06 04:20:43 字数 224 浏览 0 评论 0原文

我正在用 C 编写一个多进程程序。

我希望父进程可以等待所有子进程完成然后退出 它收到 SIGINT。

我有两个问题。

  1. 父母如何记录它分叉的子进程的每个pid。 子进程可能会在记录功能运行之前完成 主要流程。

  2. 如果父母不知道它有多少个子进程。他怎么能等 所有子进程完成。

提前致谢。

I'm writing a multi process program in C.

I hope parents process can wait all child processes finish then exit when
it receives SIGINT.

I have two questions.

  1. How can parents record each pid of child process it forked.
    Child process may finish before recording function run on
    main process.

  2. If parents has no idea about how many child processes it has. How can he wait
    all child process finish.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

忘东忘西忘不掉你 2024-12-13 04:20:43

您在派生子进程时记录子进程的 pid(如果需要)。
在 pid = 0 的循环中调用 waitpid ,它将返回退出进程的 pid 或返回 -1,如果 errno = ECHILD 则表示您没有剩余的从属进程。

You record the pid of child processes as you fork them (if required).
call waitpid in a loop with pid = 0 it will either return a pid of a process that exited or return -1 and if errno = ECHILD you have no slaves left.

天煞孤星 2024-12-13 04:20:43

继续循环调用 wait(2)。每次 wait() 返回时,您都会获得已退出子进程的 PID 及其状态。状态会告诉您它是正常退出(带有退出代码)还是由于信号退出。像这样的东西(未测试):

#include <sys/types.h>
#include <sys/wait.h>
...
pid_t    pid;
int      status;
...
while ((pid = wait(&status)) > 0) {
        printf("Child %lu ", (unsigned long)pid);
        if (WIFEXITED(status))
                printf("exited with status %d\n", WEXITSTATUS(status));
        else if (WIFSIGNALED(status))
                printf("killed by signal %d\n", WTERMSIG(status));
        else if (WIFSTOPPED(status))
                printf("stopped by signal %d\n", WSTOPSIG(status));
        else if (WIFCONTINUED(status))
                printf("resumed\n");
        else
                warnx("wait(2) returned for no discernible reason");
}

Keep calling wait(2) in a loop. Every time wait() returns, you'll get back the PID of the exited child and its status. The status will tell you, whether it exited normally (with an exit code) or due to a signal. Something like this (not tested):

#include <sys/types.h>
#include <sys/wait.h>
...
pid_t    pid;
int      status;
...
while ((pid = wait(&status)) > 0) {
        printf("Child %lu ", (unsigned long)pid);
        if (WIFEXITED(status))
                printf("exited with status %d\n", WEXITSTATUS(status));
        else if (WIFSIGNALED(status))
                printf("killed by signal %d\n", WTERMSIG(status));
        else if (WIFSTOPPED(status))
                printf("stopped by signal %d\n", WSTOPSIG(status));
        else if (WIFCONTINUED(status))
                printf("resumed\n");
        else
                warnx("wait(2) returned for no discernible reason");
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文