Linux--进程的创建

本文详细介绍了Linux下进程的创建过程,包括分配新的控制块和内核数据结构,父进程到子进程的数据拷贝(写时拷贝),子进程加入系统进程列表,以及fork函数返回后的调度。在特定情况下,如父进程等待后再执行,子进程可能变为僵尸状态,需等待父进程回收。
摘要由CSDN通过智能技术生成
一.进程创建有三种方式(这里主讲fork及vfork)
1.fork
2.vfork
3. clone

二.fork函数
1.fork用于创建一个新进程;
2.fork函数没有参数,且有两个返回值,如果fork失败返回-1,如果成功,父进程返回子进程pid,子进程返回0; (pid_t  fork( ));
3.当进程调用fork时,内核会做如下的事情:
  • 分配新的控制块和内核数据结构给子进程;
  • 将父进程的部分数据和代码拷贝至子进程,且采用写时拷贝;
  • 然后将子进程添加到系统进程列表中;
  • fork返回之后,开始调度器调度。
4.fork之前只有父进程在执行,fork之后,父子进程同时执行fork之后的代码。
例如:
#include<stdio.h>                                                         
  2 #include<unistd.h>
  3
  4 int main()
  5 {
  6     printf("Before : pid=%d\n",getpid());
  7     pid_t id = fork();
  8
  9     if(id<0)
10     {
11         perror("fork()");
12     }
13
14     printf("After: pid=%d, fork return %d\n",getpid(),id);
15     sleep(1);
16     return 0;
17 }

运行结果如下:(可以发现在执行fork之前,当前只有一个进程,也就只有一个进程输出“Before...”,fork之后父进程创建了一个子进程,父子进程同时执行fork之后的代码

5.fork调用失败的原因
1.内存不够;
2.创建进程数超过限制

三.vfork的使用及两种进程创建方式的区别
1.vfork创建的进程,保证子进程先执行,当子进程调用exec之后父进程才执行;而fork创建的子进程和父进程谁先执行并不确定,是由操作系统的调度器决定的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值