在 C 中使用两个 fork() 时如何利用每个进程

How to take advantage of each process when using two fork()'s in C

所以,我一直在努力理解分叉,虽然我理解基础知识(即,当我们使用 fork() 时,另一个进程使用原始数据的副本创建),但我不能真正掌握用创建的这些流程实际做事。

例如:我必须编写一个程序,该程序将调用 fork() 两次以创建总共 4 个进程。创建一个进程后,我必须用 getpid() 打印出 pid。打印出四个 ID 后,我的程序应该打印一个字母 10 次。

例如,父 1 将打印 'A',子 1 将打印 'B',子 2 将打印 'C',其父将打印 'D'。为此,我必须使用 putchar(ch); 并使用 fflush(stdout).

刷新输出

这意味着输出将如下所示:

Process created, ID: 3856
Process created, ID: 3857
Process created, ID: 3858
Process created, ID: 3859
AAAAAABBBBBBBCDCDCDCDCDCDCBBBDCDCAAAADCD

到目前为止,我已经使用以下代码打印了四个进程:

 int main(void) {
     pid_t child1, child2;
     child1 = fork();
     child2 = fork();
     printf("Process created. ID: %d\n", getpid());
}

但我不知道如何使用 wait() 在打印 ID 后随机打印所有内容。

要将我需要的所有内容打印出来成为 "random mess," 我应该怎么做?我应该这样调用函数吗?

// in main
for(int i = 0; i < 10; ++i) {
    char_parent1();
    char_child1();
    char_parent2();
    char_child2();
}
return 0;
}

void char_parent1()
{
    putchar('A');
    fflush(stdout);
}

void char_child1()
{
    putchar('B');
    fflush(stdout);
}

// and so on for char_parent2() and char_child2()

在那种情况下,如果我的教授说我基本上必须同时随机打印东西,那我为什么要使用 wait()

每个进程都需要知道应该打印哪个字母。这意味着您必须分析 child1child2 中的值。例如,一个进程有两个零;它可能会打印 D.

可以说,每个进程都需要知道它是否是 parent。如果它不是 parent,它可以在打印 10 份其字母后简单地退出,每份后跟一个 fflush()。如果是parent,等待其children死亡后,应该退出。这意味着原始进程将最后退出。它可以在其最后一个 child 结束后有用地输出一个换行符。您可能会也可能不会打印有关 dead children 的诊断信息。