在 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()
?
每个进程都需要知道应该打印哪个字母。这意味着您必须分析 child1
和 child2
中的值。例如,一个进程有两个零;它可能会打印 D
.
可以说,每个进程都需要知道它是否是 parent。如果它不是 parent,它可以在打印 10 份其字母后简单地退出,每份后跟一个 fflush()
。如果是parent,等待其children死亡后,应该退出。这意味着原始进程将最后退出。它可以在其最后一个 child 结束后有用地输出一个换行符。您可能会也可能不会打印有关 dead children 的诊断信息。
所以,我一直在努力理解分叉,虽然我理解基础知识(即,当我们使用 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()
?
每个进程都需要知道应该打印哪个字母。这意味着您必须分析 child1
和 child2
中的值。例如,一个进程有两个零;它可能会打印 D
.
可以说,每个进程都需要知道它是否是 parent。如果它不是 parent,它可以在打印 10 份其字母后简单地退出,每份后跟一个 fflush()
。如果是parent,等待其children死亡后,应该退出。这意味着原始进程将最后退出。它可以在其最后一个 child 结束后有用地输出一个换行符。您可能会也可能不会打印有关 dead children 的诊断信息。