进程之子进程的创建和回收

本文介绍了Linux系统中子进程的基本概念,包括其创建、父子进程的特性以及进程的结束。通过`fork()`函数创建子进程,子进程继承父进程内容但拥有独立地址空间。当父进程结束,子进程成为孤儿进程,反之则可能产生僵尸进程。`wait()`和`waitpid()`用于回收子进程,管理进程生命周期。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、子线程的概念

子进程为由另外一个进程(对应称之为父进程)所创建的进程。子进程的代码初始为父进程的copy,但不会无限copy。
~在linux下除了0号进程,其他都算是子进程。

二、子进程的创建

1.创建函数

代码如下:

 #include  <unistd.h>
 pid_t  fork(void);

创建新的进程,失败时返回EOF
成功时父进程返回子进程的进程号,子进程返回0
通过fork的返回值区分父进程和子进程


2.父子进程的特性

a.子进程继承了父进程的内容
b.父子进程有独立的地址空间,互不影响
c.若父进程先结束子进程成为孤儿进程,被init进程收养子进程变成后台进程
d.若子进程先结束父进程如果没有及时回收,子进程变成僵尸进程

3.进程的结束

  #include <stdio.h>
  #include <stdlib.h>

  int main(void) {
     printf(“this process will exit”);
     exit(0);
     printf(“displayed”);
  }

注意:exit结束进程时会刷新流的缓冲区
main函数结束时会隐式地调用exit函数,所以有时在main段里不需要特意加上exit函数

exit()和return()的区别在于前者使当前函数退出,后者使整个程序退出

三、子进程的回收

#include  <unistd.h>
  pid_t wait(int *status);  

成功时返回回收的子进程的进程号;失败时返回EOF
若子进程没有结束,父进程一直阻塞
若有多个子进程,哪个先结束就先回收
status 指定保存子进程返回值和结束方式的地址,需要时调用
status为NULL表示直接释放子进程PCB,不接收返回值

#include  <unistd.h>
  pid_t waitpid(pid_t pid, int *status, int option);

/*
pid>0时,只等待固定进程ID的结束,否则一直等待。
pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一样。
pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
pid<-1时,等待一个进程组中指定的子进程为pid的绝对值。

option
可以为0。
WNOHANG :若由pid指定的子进程未发生状态改变(没有结束),则waitpid()不阻塞,立即返回0。
WUNTRACED: 返回终止子进程信息和因信号停止的子进程信息。
wait(wait_stat) 等价于waitpid(-1,wait_stat,0)
*/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值