Linux:简单进程编程记录

简单进程编程说明

简单描述进程编程的几个小知识点


三种特殊的进程

  1. 僵尸进程

    若子进程退出且未告知父进程,称该子进程为
    僵尸进程
  2. 孤儿进程

    若父进程退出且子进程尚未退出,该子进程托孤给 init 进程即1号进程,称该子进程为
    孤儿进程
  3. 守护进程
    通过结束其父进程,并对其进行一定的处理使其脱离于终端并且在后台运行的子进程,称该子进程为 守护进程

  • 原因
    一般 僵尸进程 孤儿进程 是由于意外情况(如程序员编码时的疏忽等)产生,而 守护进程 是为了执行特定的任务而编写

  • 僵尸进程的危害:

    子进程退出时,Unix在 释放其大部分资源的同时也会保留一部分信息如进程号等,直到父进程调用waitwaitpid 时才释放,因此产生大量的僵尸进程之后将会耗尽有限的进程号而无法产生新进程

  • 如何避免产生僵尸进程

    1. 父进程通过waitwaitpid等函数
    2. signal函数
    3. fork 两次(将其转为孤儿进程)
  • 如何创建守护进程

    • 创建子进程,终止父进程
    • 在子进程中创建新会话
    • 改变工作目录
    • 重设文件创建掩码
    • 关闭文件描述符
  • 创建守护进程的关键代码(示例)

    • fork();
    • setsid();
    • chdir("/");
    • umask(0);
    • close(fd);

部分相关函数

  1. fork vs vfork
函数资源执行顺序
fork创建的子进程拷贝父进程的数据段,代码段各自代码段位置往下执行,执行顺序不定
vfork创建的子进程与父进程共享数据段在子进程没有调用exec和exit之前,父进程阻塞

备注
  很多情况下,fork之后会接着使用exec,导致很多复制的资源被替换,代价较高,因此有了vfork
  如今fork有了写时复制的机制(cow),所以复制的代价较底(复制父进程页表的代价),而且vfork伴随着一些安全问题,因此尽量使用fork

  1. exit vs _exit
函数退出时的步骤
exit1、调用 atexit() 注册的函数;2、关闭打开的流(写所有缓冲输出),删除 TMPFILE 函数建立的临时文件;3、调用 _exit() 函数终止进程
_exit1、属于该过程的文件描述符都将被关闭;2、进程的任何子进程都由进程1继承;3、进程的父节点发送SIGCHLD信号
  1. wait vs waitpid
函数简易说明参数区别
wait父进程阻塞等待子进程结束返回信息参数:status得到子进程的退出状态,可为null,即忽略该退出状态一定程度上属于waitpid的特例
waitpid父进程阻塞等待子进程结束返回信息参数:pid可指定进程号;status与上述相同;option允许改变waitpid的行为不一定阻塞调用者,option使其功能更多样化

备注 1
waitpid的参数详解:

  • pid:
    • pid = -1:等待任意一个子进程
    • pid > 0 :等待进程号为pid的子进程
    • pid = 0 :等待与调用者同进程组的任意一个子进程
    • pid < -1:等待组ID等于pid绝对值的任意一个子进程
  • option(可组合):
    • 0:不使用以下两种参数
    • WNOHANG:如果没有已经结束的子进程则马上返回,不予等待
    • WUNTRACED:如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会

备注 2
获取 staus 后检测处理

  • WIFEXITED(status) 如果进程子进程正常结束,返回一个非零值
    • WEXITSTATUS(status) 如果 WIFEXITED 非零,返回子进程退出码
  • WIFSIGNALED(status) 子进程因为捕获信号而终止,返回非零值
    • WTERMSIG(status) 如果 WIFSIGNALED 非零,返回信号代码
  • WIFSTOPPED(status) 如果进程被暂停,返回一个非零值
    • WSTOPSIG(status) 如果 WIFSTOPPED 非零,返回信号代码
  1. system函数
  • 说明:
    执行特定命令,阻塞当前进程直到命令执行完毕
  • 返回值:
    无法启动shell执行命令则返回127
    其他错误返回-1
    顺利执行返回相关命令的退出码
  • 备注:
    执行时调用forkexecvewaitpid等函数

进程中止的几种方式

  1. main函数结束
  2. 调用exit函数
  3. 调用_exit函数
  4. 调用abort函数
  5. 接收进程终止信号
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值