如何使两个子进程等待彼此

时间:2017-01-22 23:05:44

标签: c++ c process operating-system fork

我正在研究操作系统中的流程。我提出了一个问题,我必须使用fork和wait创建两个子进程来执行类似的任务。在父分叉第一个孩子之后,该孩子将等到父母分叉另一个孩子并且第二个孩子完成其工作。

例如,如果我希望第一个孩子显示10个第一个偶数,第二个孩子显示10个第一个奇数,则输出应该是这样的:

第二个孩子 1 3 5 7 9 11 13 15 17 19 第二个孩子死了 第一个孩子 2 4 6 8 10 12 14 16 18 20 第一个孩子去世了

端!

我一直在尝试各种各样的方法,但我无法让第一个孩子等到第二个孩子完成工作。 有谁知道怎么做? 感谢

2 个答案:

答案 0 :(得分:1)

这些不是最佳选择,但可以解决问题:

首先,选项使用共享对象:
- 您可以使用mmap创建共享内存区域(请参阅man mmap) - 您可以使用shmget和shmat函数系列
- 因此你会得到彼此的PID,并能够使用等待(男人2等)

第二个选项:
- 父母知道两个孩子的PID - 家长将逐个向两个孩子发送信号。 (请参阅man 2 kill(并且不要发送KILL信号))
- 每个孩子都有一个自定义父母,并对此信号做一些事情。

答案 1 :(得分:0)

根据您提供的示例,我考虑使用系统调用和C库调用组合处理两个问题:

  1. 选择可用于从另一个进程通知进程的进程间资源。
  2. 在不使用换行符的情况下刷新输出流(查看示例输出的格式化方式)。
  3. 解决第一个问题取决于您要为其实现此操作系统。通常,POSIX兼容的操作系统将提供一些可用于此的机制。这些机制可能包括进程控制,管道,套接字,信号,信号量,共享内存,文件操作和消息传递。非POSIX兼容系统也可能具有一些可以使用的机制或类似功能,但为了这个答案,我坚持使用目标操作系统是符合POSIX标准的类Unix操作系统。

    第二个问题更简单的只是知道如何刷新代码使用的输出流。 C库标准IO流和fflush调用可用于此目的。

    这里有一些我掀起的代码将这些代码放在一起,为我编译,然后给出你显示的输出:

        #include <unistd.h>
        #include <sys/types.h>
        #include <sys/wait.h>
        #include <signal.h>
        #include <stdio.h>
        #include <stdlib.h>
    
        int main()
        {
                const int use_sig = SIGUSR1;
                pid_t child1 = fork();
                if (child1 == 0)
                {
                        sigset_t set;
                        sigemptyset(&set);
                        sigaddset(&set, use_sig);
                        int sig;
                        do
                        {
                                sigwait(&set, &sig);
                        } while (sig != use_sig);
                        printf("First child ");
                        printf("2 4 6 8 10 12 14 16 18 20");
                        printf(" first child dies");
                        fflush(NULL);
                        return 0;
                }
                pid_t child2 = fork();
                if (child2 == 0)
                {
                        printf("Second child ");
                        printf("1 3 5 7 9 11 13 15 17 19 ");
                        printf("second child dies ");
                        fflush(NULL);
                        kill(child1, use_sig);
                        return 0;
                }
                for (;;)
                {
                        int status;
                        pid_t pid = wait(&status);
                        if (pid == child1)
                        {
                                child1 = 0;
                        }
                        else if (pid == child2)
                        {
                                child2 = 0;
                        }
                        if (child1 == 0 && child2 == 0)
                        {
                                break;
                        }
                }
                printf("\n");
                exit(EXIT_SUCCESS);
        }