我正在研究操作系统中的流程。我提出了一个问题,我必须使用fork和wait创建两个子进程来执行类似的任务。在父分叉第一个孩子之后,该孩子将等到父母分叉另一个孩子并且第二个孩子完成其工作。
第二个孩子 1 3 5 7 9 11 13 15 17 19 第二个孩子死了 第一个孩子 2 4 6 8 10 12 14 16 18 20 第一个孩子去世了
我一直在尝试各种各样的方法,但我无法让第一个孩子等到第二个孩子完成工作。 有谁知道怎么做? 感谢
答案 0 :(得分:1)
这些不是最佳选择,但可以解决问题:
首先,选项使用共享对象:
- 您可以使用mmap创建共享内存区域(请参阅man mmap)
- 您可以使用shmget和shmat函数系列
- 因此你会得到彼此的PID,并能够使用等待(男人2等)
第二个选项:
- 父母知道两个孩子的PID
- 家长将逐个向两个孩子发送信号。 (请参阅man 2 kill(并且不要发送KILL信号))
- 每个孩子都有一个自定义父母,并对此信号做一些事情。
答案 1 :(得分:0)
根据您提供的示例,我考虑使用系统调用和C库调用组合处理两个问题:
解决第一个问题取决于您要为其实现此操作系统。通常,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);
}