c语言的fork函数是拿来创建子进程的,
进程 = pcb(process control block) + 代码和数据
子进程中的代码和数据与父进程的一致(共享父进程的代码和数据),没有自己的代码和数据.
如果父进程或者子进程要修改数据,操作系统就会把要修改的数据拷贝一份新的,让目标进程修改这份拷贝的.
如果父进程在创建子进程之前执行了一些代码,那么子进程不会再执行这些代码.
如果fork创建子进程成功,会有两个返回值,父进程得到子进程的PID的值(大于0),子进程得到等于0的返回值.
如果fork创建子进程失败,返回-1给父进程.
父进程可以有很多个子进程,而子进程只有一个父进程.
父进程获得子进程的PID便于管理,子进程通过getppid()函数就能找到父进程的pid.
那为什么fork会有两个返回值呢?
在fotk函数的内部,
它需要完成的功能有:申请新的pcb→拷贝父进程给子进程→将子进程pcb放进进程的清单,甚至放进调度队列.
在子进程已经被创建甚至调度的情况下,子进程和父进程都会执行fork的return语句.因此有两个返回值.
让我们来看看下面的代码加深理解
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<sys/types.h>
4
5
6 int val=0;
7
8 int main()
9 {
10 printf("我是父进程,我的pid是: %d\n",getpid());
11 pid_t id =fork();
12 if(id<0)
13 {
14 printf("进程创建失败\n");
15 }
16 else if (id == 0)
17 {
18 val+=10;
19 printf("我是子进程,我的pid是: %d, 我的父进程是: %d,我的va
为%d\n",getpid(),getppid(),val);
20 }
21 else{
22 printf("我是父进程,我的pid是: %d,我的val为%d\n",getpid(),val);
23 }
24 return 0;
25 }
运行结果为