使用 fork 和 waitpid() 的进程的具体执行顺序

问题描述 投票:0回答:1

使用 fork() 系统命令在 c 中从父进程创建 4 个进程。之后,以遵循特定执行顺序的方式打印进程及其 ID

P4->P1->P3->P2->P0

其中P0是父进程,所有其他进程(P1,P2,P3,P4)都是由父进程P0创建的。 不要使用 sleep() 命令

#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<unistd.h>
int main()
{
    for(int i=1;i<=4;i++)
    {
        if(fork()==0)
        {
            if(i==2)
            {
                for(int k=1;k<=3000;k++)
                { 
                    waitpid(getpid(),NULL,0);
                }
            }
            else if(i==3)
            {
                for(int k=1;k<=2000;k++)
                { 
                    waitpid(getpid(),NULL,0);
                }
            }
            else if(i==1)
            {
                for(int k=1;k<=1000;k++)
                {
                   waitpid(getpid(),NULL,0);
                }
            }
            printf("Hello I am child process. My process id is %d parent process id is %d\n",getpid(),getppid());
            exit(0);
        }
    }
    for(int i=0;i<4;i++)
    wait(NULL);
    printf("HI i am a parent . My process id is %d\n",getpid());


}
c process operating-system synchronization fork
1个回答
0
投票

只有父进程才应对其子进程调用

wait
waitpid
,以获得其终止状态。为了强制子进程内部执行一定的顺序,您需要某种 IPC 机制。这可能是从父进程调度的事件。

我会使用 Linux 特定的 eventfd(用于在进程之间发送信号事件的文件描述符)编写类似的内容:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/eventfd.h>

int main(void) {
    pid_t child_pids[4] = { 0 };
    eventfd_t events[4] = { -1 };
    eventfd_t back_events[4] = { -1 };

    for (int i = 0; i < 4; ++i) {
        int event_fd = eventfd(0, 0);
        int back_event_fd = eventfd(0, 0);
        const pid_t pid = fork();

        if (pid == 0) {
            eventfd_t value;
            eventfd_read(event_fd, &value);
            printf("Output from process %d\n", getpid());
            eventfd_write(back_event_fd, value);
            exit(0);
        } else if (pid > 0) {
            child_pids[i] = pid;
            events[i] = event_fd;
            back_events[i] = back_event_fd;
            printf("Forked process %d\n", pid);
        } else {
            perror("fork");
        }
    }

    eventfd_t value = 1;

    for (int i = 0; i < 4; ++i) {
            eventfd_write(events[i], value);
            eventfd_read(back_events[i], &value);
    }

    pid_t wpid;

    while ((wpid = wait(NULL)) > 0) {
        printf("Process %d terminated\n", wpid);
    }

    return 0;
}

我的系统上的输出:

Forked process 20795
Forked process 20796
Forked process 20797
Forked process 20798
Output from process 20795
Output from process 20796
Output from process 20797
Output from process 20798
Process 20795 terminated
Process 20796 terminated
Process 20797 terminated
Process 20798 terminated

eventfd
调用周围添加一些额外的错误检查也没什么坏处。

© www.soinside.com 2019 - 2024. All rights reserved.