我有这个程序
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x =1;
int* y = malloc(sizeof(int));
*y = 2;
if (fork()==0)
x++;
if (fork()==0)
(*y)++;
printf("%d", (x+*y));
}
这是输出3445.这是我所知道的,fork()创建了一个新的子进程。如果是子进程,则fork()返回0;如果是父进程,则返回PID。所以一旦你调用fork(),它就变成了父和fork()== 0只在子进程而不是父进程上才为真。任何人都可以让我更深入地了解实际发生的事情,以便获得输出吗?
答案 0 :(得分:2)
绘制图表显示子父母关系,他们的统计数据有所不同,这里有一种可能的形式(儿童为C,父母为P):
fork()
C (x == 2, *y == 2)
fork()
C (x == 2, *y == 3) ==> print 5
P (x == 2, *y == 2) ==> print 4
P (x == 1, *y == 2)
fork()
C (x == 1, *y == 3) ==> print 4
P (x == 1, *y == 2) ==> print 3
因此,将打印5,3,4,4的组合,确切的组合取决于这些printf()
被调用的顺序,可能与运行不同。
答案 1 :(得分:0)
fork()在出错时返回-1,因此您也必须检查它。 所以最好做一些像:
int pid;
pid = fork();
if (pid == 0)
{
//child process code goes here
}
if (pid > 0)
{
//parent process code goes here
}
请注意,在第一个fork()之后的两个进程再次执行fork(),因此最终会有4个进程。
当然,它们的执行顺序是未定义的,因此每次运行时,您将获得3个,5个和4个不同的组合。
另外,请注意,如果不在fork()之前调用flush(...),某些printf(...)和fork()组合会导致奇怪的输出。
最后,你忘了在最后释放(y),所以每次运行这个程序时都会泄漏4 * sizeof(int)字节。