一文讲懂fork函数(c语言&linux)

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 }

运行结果为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值