c - parent 和多个 child 的 PID。 Fork & waitpid - 函数

标签 c linux function fork waitpid

我在使用 fork/waitpid 函数时遇到问题。

我正在尝试编写程序,首先处理和打印子 PIDS,然后是父 PID

我的代码:

int main(void)
{
    pid_t pid;
    int rv = 0;
    int i = 1;
    pid_t child_pids[2];

    for (i = 0; i < 2; i++)
    {

        switch (pid = fork())
        {
        case -1:
            perror("fork");
            exit(1);

        case 0:
            pid = getpid();
            exit(i);
            break;

        default:
            child_pids[i] = pid;
            break;
        }
    }
    if (pid != 0 && pid != -1) {
        for (i = 0; i<2; i++){
            int status = 0;
            printf("PARENT: waiting for child %d (%d)\n", i, child_pids[i]);
            rv = waitpid(child_pids[i], &status, 0);
            printf("Child: %d, Here!!!\n", i);

        }
        printf("parent pid = %d\n", getpid());

    }
}

目前,它先创建父项,然后再创建子项。那么有人有什么提示可以做什么吗?

最佳答案

来自 waitpid(2)manpage :

The value of pid can be: [...] -1 meaning wait for any child process.

waitpid(): on success, returns the process ID of the child whose state has changed; [...]

这意味着您可以像这样在 main 的末尾简单地循环 waitpid:

#define FORKED_CHILDREN 2

if (pid != 0 && pid != -1) {
    for (int collected = 0; collected < FORKED_CHILDREN; ++collected) {
        pid_t cpid = waitpid(-1, NULL, 0);
        printf("Child pid: %d\n", cpid);
    }
    printf("parent pid = %d\n", getpid());
}

关于c - parent 和多个 child 的 PID。 Fork & waitpid - 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28454645/

相关文章:

c++ - 什么方法可以创建 16 字节校验和

c - 找出两组 10 位数字的并集

c - 每 n 秒更改一次 PID 的程序

通过脚本解析Linux日志文件语法

Linux shell 脚本 : echo only a char, 没有处理空格

javascript - 我正在创建一个代码来根据一天中的时间向我打招呼,由于某种原因,它无法将我的名字与其他文本区分开来

c - 如何向 C 中的进程发送信号?

python - 用python点亮led灯

javascript - 函数声明与函数表达式 : what will be printed in this case?

javascript - 为什么这显示不是函数 - javascript