fork()函数是一个非常有趣的函数(也令人很迷惑),其下是一些方面:
1.调用一次,返回两次。
fork函数被调用后,会产生两个进程,子进程与父进程,返回值各不相同,子进程返回值为0,父进程返回值为1。
2.并发执行
子进程与父进程是并发执行的。但同时又独立。下面是一段代码的运行结果
`void fork0()
{
if (fork() == 0) {
printf("Hello from child\n");
}
else {
printf("Hello from parent\n");
}
}`
结果:一种是
Hello from parent
Hello from child
另一种是
Hello from child
Hello from parent
3.相同但独立的地址空间
子进程与父进程的地址空间是相同的,他们具有相同的用户栈、相同的本地变量值、相同的堆、相同的全局变量,以及相同的代码。
4.共享文件
子进程会继承父进程,这个有点类似于孩子继承父亲遗产的感觉。
在实际代码中,画进程图对理解代码很重要。
最简单的代码分析:
```c
int main(){
int x=1
if(fork()==0)
x++;
else
x--;
print("x==%d\n",x);
exit(0);
"
如下图是画出来的进程图:
首先我们根据代码自上向下,画图先是main函数A指向fork()函数B,fork语句后分子进程与父进程,子进程执行x++,父进程执行x–,此后分别执行printf输出x=2和x=0,此处为并发,输出值顺序不定。
经验总结:若代码较复杂的话,跟着代码画流程图,是最简单和最直观的方法。