进程控制浅谈 fork、exit、wait、exec

本文深入探讨Linux中的进程控制,包括fork()创建进程、exit()正常和异常退出进程、wait()等待子进程状态及exev()进行进程替换。通过实例分析了父子进程间的代码和数据共享特性,以及进程退出状态和进程等待的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


进程创建  fork()

在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。

使用fork()需要包含   #include<unistd.h>

fork(void) 的返回值类型为 pid_t

    给父进程返回创建成功的子进程的PID(进程号),给子进程返回 0。

代码举例:

 结果:

   由输出结果我们看到,在代码 if 和 else if 中的语句都被执行了,这貌似和我们之前的认知不同,两个相反的逻辑块中的代码都被执行了。

   这是因为在fork()之后,代码有两个执行流,分别执行父子进程的逻辑块。

   在上面的例子中, 在父进程中的fork()给父进程中的ret返回子进程PID:11020,而给子进程返回0,所以在往下走就执行不同的逻辑块。

注意:在默认情况下,父子进程共享所有代码(包括fork()之前的代码),数据私有“(这个私有是打引号的,具体原因会在后面的写时拷贝中解释)

既然父子进程代码共享,父进程从fork后继续执行代码可以理解,但为什么子进程也从子进程也称fork()后面开始执行???

   因为子进程成功创建后,子进程的PCB程序控制中保存的有父进程PCB中程序计数器中的将要执行的下一步指令信息,所以说虽然父子进程的代码一样,但是不是从头开始执行的,都是从fork()之后开始执行。

为什么父子进程的代码要共享???

   我们要知道进程的代码属于逻辑框架,是不可被修改的,能修改的知识数据部分。而且系统是在页表上对物理内存中的访问设置的是只读权限,所以代码就是只能读不能改。那么如果代码不共享,父子进程各自私有代码,那么就需要给子进程新开辟空间重新存放一份与父进程一模一样的代码,造成资源浪费。

为什么父子进程的数据私有???

<
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值