我有这个C代码序列:
printf("\nThe PID of this (main) process is: %d\n", getpid());
if(fork() != -1) { // #1
printf("\n\nParent 1 PID: %d\n", getpid());
for(int i = 0; i < 10; i++) {
printf("\n%d", i);
}
if(fork() != -1) { // #2
//sleep(1);
printf("\n\nParent 2 PID: %d\n", getpid());
for(char i = 'a'; i != 'f'; i++) {
printf("\n%c", i);
}
}
else { // #3
sleep(3);
printf("\n\nChild 2 PID: %d\n", getpid());
for(char i = 'F'; i != 'J'; i++) {
printf("\n%c", i);
}
}
}
else { // #4
sleep(4);
printf("\n\nChild 1 PID: %d\n", getpid());
for(int i = 10; i < 20; i++) {
printf("\n%d", i);
}
}
我希望我有4个程序:两个父母和两个孩子。
在第1行,我第一次调用fork()
,第1行到第4行的所有内容都将在第一个父进程中执行。
在父进程(1)中,我再次调用fork()
,所以从第2行到第3行我将拥有父2进程,从第3行到第4子进程。
我希望打印的内容:
Parent 1 PID: ....
0
1
2
3
4
5
6
7
8
9
Parent 2 PID: ....
a
b
c
d
e
Child 2 PID: ....
F
G
H
I
Child 1 PID: ....
10
11
12
13
14
15
16
17
18
19
我实际上得到了什么:
Parent 1 PID: 3877
0
1
2
3
4
5
6
7
8
Parent 1 PID: 3878
0
1
2
3
4
5
6
7
8
9
Parent 2 PID: 3877
a
b
c
d
e9
Parent 2 PID: 3878
9
a
b
c
d
Parent 2 PID: 3879
a
b
c
d
e9
eParent 2 PID: 3880
a
b
c
d
e
我做错了什么?
答案 0 :(得分:3)
这条线没有按你的想法行事:
if(fork() != -1) { // #1
父母和孩子都会成功(只要fork
是可能的,这几乎总是如此)。你的意思是在这里测试0。父母将获得0,孩子将获得> 0。 -1是错误。
在您的情况下,您标记为&#34;孩子&#34;除非有错误,否则不应执行双腿。我不认为这就是你的意思。你所看到的是最初的2(父和子)叉子加4(父+子* 2)第二叉子。这就是6个叉子,这是输出所表明的。
答案 1 :(得分:2)
来自man fork
:
RETURN VALUE
On success, the PID of the child process is returned in the parent, and 0 is returned in the child. On failure, -1 is returned in the parent, no child process is created, and errno
is set appropriately.
这意味着,您应该在子进程中期望0和父进程中的子进程pid,因此您的代码应如下所示:
switch(pid = fork()) {
case -1: //error handling here
case 0: // child process code here
default: // parent process code here.
}
圣诞快乐:)
答案 2 :(得分:0)
了解Fork System调用的详细功能? 你可以去这个链接: http://linuxtrainers.wordpress.com/2014/12/31/how-fork-system-call-works-what-is-shared-between-parent-and-child-process/