所以我进入并发编程,但由于某种原因,我甚至无法使用基础知识。我有一个名为fork.c的文件,其中包含一个方法main。在这个方法中,我将两次分叉到子进程1和2中。
在小孩1中,我打印字符'A'50次。
在孩子2中,我将字符'B'打印50次。
当我运行我的代码时,我得到输出AAAAA ... AAAABBBBBB .... BBBBBB。但从来没有像ABABABABABABAB那样....事实上,有时我甚至得到BBBBB ...... BBBBAAAA ...... AAAAA。
那为什么我会遇到这种行为?也许我完全错了。
#include <stdlib.h>
#include <stdio.h>
void my_char(char n) {
write(1, &n, 1);
}
int main() {
int status;
pid_t child1, child2;
if (!(child1 = fork())) {
// first childi
int a;
for (a = 0; a < 50; a++) {
my_char('A');
}
exit(0);
} else if (!(child2 = fork())) {
// second child
int a;
for (a = 0; a < 50; a++) {
my_char('B');
}
exit(0);
} else {
// parent
wait(&child1);
wait(&child2);
my_char('\n');
}
return 0;
}
答案 0 :(得分:8)
他们 并发运行,但这些进程在启动后几乎立即结束。换句话说,它们太短,实际上没有任何真正的重叠。
编辑:
启动另一个进程所需的时间比运行它们所需的时间长。因此重叠的可能性很小。 (还有缓冲问题,我将省略)
您需要每个流程完成更多工作。尝试打印超过50个。打印超过10000可能就足够了。
答案 1 :(得分:3)
我认为这更容易理解fork()的工作原理:
#include <stdlib.h>
#include <stdio.h>
int main() {
pid_t child1, child2;
printf("Start\n");
if (!(child1 = fork())) {
// first childi
printf("\tChild 1\n");
sleep(5);
exit(0);
} else if (!(child2 = fork())) {
// second child
printf("\tChild 2\n");
sleep(5);
exit(0);
} else {
// parent
printf("Parent\n");
wait(&child1);
printf("got exit status from child 1\n");
wait(&child2);
printf("got exit status from child 2\n");
}
return 0;
}
......这是输出:
Start
Child 1
Parent
Child 2
got exit status from child 1
got exit status from child 1