一、fork函数的使用
fork函数被声明在unistd.h头文件中,包含
#include <unistd.h>
这个头文件即可调用。
C语言创建子进程是调用fork(),废话少说,如下一段程序:
int main ()
{
pid_t fpid; //fpid表示fork函数返回的值
int count=0;
fpid=fork(); //以下的语句父进程和子进程都会执行,主要用pid来区分
if (fpid < 0)
printf("error in fork!");
else if (fpid == 0) {
printf("i am the child process, my process id is %d/n",getpid());
printf("我是爹的儿子/n");//对某些人来说中文看着更直白。
count++;
}
else {
printf("i am the parent process, my process id is %d/n",getpid());
printf("我是孩子他爹/n");
count++;
}
printf("统计结果是: %d/n",count);
return 0;
}
fork()之后的语句父进程和子进程都会执行,新主要用pid来区分,进程也会分配到新的内存空间,上面的count是两个进程中的不同内存中的变量,没有任何意外,上面的程序运行结果当然是:
运行结果:
i am the parent process, my process id is 3323
我是孩子他爹
统计结果是: 1
i am the child process, my process id is 3324
我是爹的儿子
统计结果是: 1
进程运行不一定是上面这个顺序,要看系统的进程调度策略。
二、fork函数结合与或逻辑的实践
遇到一个又去的试题:
以下一段程序中,main进程共创建了多少个子进程?
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
fork();
fork() && fork() || fork();
fork();
return 0;
}
答案是:总共有20个进程,除了main进程,还有19个子进程。
分析如下:
main函数中第2行和第3行代码顺序先后不会影响结果,故提出第2行代码 fork() && fork() || fork(),标记为 a && b || c,
根据语法有
a非0(a父进程),则执行b,有 1 && 1 和 1 && 0 || 1 及1 && 0 || 0;
a为0(a子进程),则不执行b,而执行c,有 0 && || 1 和0 && || 0;
共有5个分支,也就是说,fork() && fork() || fork()共创建了5个进程,而前面还有2个fork,所以进程数为:
4*5=20个进程。
so.......................