一、啥叫fork
百度翻译的解释是
餐叉; 叉(挖掘用的园艺工具); (道路、河流等的) 分岔处,分流处,岔口,岔路;
而在Linux系统里 fork()函数是一个比较好玩的东西。
fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本。
二、使用
我们可以看一个简单的例子
以下所有的程序的测试环境
系统:deepin 15.11
这个系统大概长这个样子
void fork0()
{ pid_t fpid;
fpid=fork();
if (fpid == 0) {
printf("Hello from child\n");
}
else {
printf("Hello from parent\n");
}
}
调用后的运行结果:
Hello from parent
Hello from child
两条输出 parent表示父进程,child表示子进程。
为什么嘞
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
这个程序执行的时候 父进程和子进程的代码都为fork之后的代码
但因为fork()返回的值不同 所以打印了不同的语句。
三、开始疯狂练习
1.
void fork1()
{
int x = 1;
pid_t pid = fork();
if (pid == 0) {
printf("Child has x = %d\n", ++x);
}
else {
printf("Parent has x = %d\n", --x);
}
printf("Bye from process %d with x = %d\n", getpid(), x);
}
输出结果:
Parent has x = 0
Bye from process 21410 with x = 0
Child has x = 2
Bye from process 21411 with x = 2
2.
void fork2()
{
printf("L0\n");
fork();
printf("L1\n");
fork();
printf("Bye\n");
}
输出结果
L0
L1
L1
Bye
Bye
Bye
Bye
3.
void fork3()
{
printf("L0\n");
fork();
printf("L1\n");
fork();
printf("L2\n");
fork();
printf("Bye\n");
}