目录
本质:fork函数是一个system call,也就是系统调用
作用:创建子进程
参数:无参
返回值:
1.类型是pid_t,本质就是int类型
2.创建失败:返回-1;
创建成功:有两个返回值,给父进程返回子进程的pid,给子进程返回0
包含头文件:unistd.h
- #include
- #include
- #include
-
- int main()
- {
- pid_t id = fork();
-
- if(id < 0)//fork创建子进程失败
- {
- perror("fork");//打印错误信息
- exit(0);//结束进程
- }
- else if(id == 0)//执行子进程代码
- {
- //...
- //例如
- while(1)
- {
- printf("This is Son Process, ret:%d, pid:%d, ppid:%d\n",id,getpid(),getppid());
- sleep(1);
- }
- }
- else//执行父进程代码
- {
- //...
- //例如
- while(1)
- {
- printf("This is Parent Process, ret:%d, pid:%d, ppid:%d\n",id,getpid(),getppid());
- sleep(1);
- }
- }
- return 0;
- }
可以看到else if 与 else的代码同时执行了!
两个while死循环同时执行了!!
为什么会这样?
就是因为这是两个进程,两个共享fork之后的代码,但独立运行,互不干扰
此外,这里在实际应用中就用fork返回值id分别让父子进程执行不同的代码
但是有人问父子进程代码在fork之后不是共享的吗?
答:是共享的,共享与能执行是两回事,父子进程彼此能看到对方的代码,但是能执行的代码被返回值分开了
为什么给子进程返回0,为什么给父进程返回子进程的pid?
答:每个父亲可以有多个孩子,但每个孩子只会有一个父亲,所以父亲需要给孩子起名字来标识这个孩子
为什么fork函数有两个返回值,难道之前学的函数只有一个返回值不对吗?
答:函数有且仅有一个返回值,这一结论是肯定的!
那么为什么fork有两个返回值?
当前阶段,只能先简单认识一下。
但是这里有遗留问题!!!
返回两次,不代表会被记录两次,同一个变量:id,怎么会能同时记录两个数据呢?
这个问题在后面的博客中会给出解释,目前为止理解到这里就可以了
fork一次,创建一个子进程,一共有两个进程
那么fork两次,fork三次,fork四次,一共有多少个进程??
对于这个问题,先画出一张图,就可以很容易的解释了。
总结规律:n次fork一共会有2^n个进程