2828|2

241

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

Helper2416-30——Linux_Programing——进程等待与终止 [复制链接]

本帖最后由 yuanlai2010 于 2014-8-7 10:57 编辑

进程等待与终止
参与Helper2416开发板助学计划心得
程等待
在上一张帖子中的第一个实验中,出现了如下的打印结果,有点乱.
  1. [root@jyxtec fork]# ./fork_arm
  2. fork program starting!
  3. this is parant, the PID is 126
  4. and the count = 1
  5. [root@jyxtec fork]# this is child, the PID is 127
  6. and the count = 1
复制代码
分析可以知道,父进程肯定是在子进程结束之间就已经结束了,这里也可以看出,子进程有它自己的生命周期,且可以独立运行的。
可以通过在父进程中调用wait函数来等待子进程结束。
  1. #include <sys/types.h>
  2. #include <sys/wait.h>

  3. pid_t wait(int *stat_loc):
复制代码
一旦调用wait,父进程将会进入阻塞状态直到子进程的状态信息出现为止,这将在子进程结束时发出这个状态信息。这个调用返回子进程的PID,他通常是已经结束运行的子进程的PID。状态信息允许父进程了解子进程的退出状态,即子进程的main函数返回的值或者子进程中exit函数的退出码。如果stat_loc不是空指针,状态信息将被写入他所指向的位置。
代码实例
  1. /* 2014 - 08 -07
  2. * yuanlai2010
  3. * fork调用测试
  4. */

  5. #include <unistd.h>
  6. #include <sys/types.h>
  7. #include <sys/wait.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>

  10. int main()
  11. {
  12.         pid_t pid;
  13.         int count = 0;
  14.         
  15.         printf("fork program starting!\n");
  16.         
  17.         pid = fork();
  18.         
  19.         switch(pid){
  20.         case -1:
  21.                 printf("fork failed\n");
  22.                 exit(1);
  23.         case 0:
  24.                 printf("this is child, the PID is %d\n", getpid());
  25.                 printf("and the count = %d\n",++count);
  26.                 break;
  27.         default:
  28.                 printf("this is parant, the PID is %d\n",getpid());
  29.                 printf("and the count = %d\n",++count);
  30.                 wait(NULL);
  31.                 break;
  32.         }
  33.         exit(0);
  34. }
复制代码
运行结果
  1. [root@jyxtec fork]# ./fork_arm
  2. fork program starting!
  3. this is parant, the PID is 128
  4. and the count = 1
  5. this is child, the PID is 129
  6. and the count = 1
  7. [root@jyxtec fork]#
复制代码
加入wait后可以看到显示的信息正常了,但这并不是wait真正要完成的工作,接下来继续来探讨

关与exit函数可以参考@lonerzf 的这篇帖子https://bbs.eeworld.com.cn/thread-443526-1-1.html
.
程终止
子进程终止时,它与父进程之间的关联还会继续保持,直到父进程也终止或者父进程调用wait或者waitpid才算真正的结束,因为子进程在终止后到正真结束之前,虽然子进程不再运行了,但它却还存在与系统中,因为它的退出码还需要保存起来,以备父进程的wait调用使用。这时他将成为一个僵尸进程(zombie)有些Linux分支中可能称为(defunct)。

但是,如果在父进程结束后,子进程还在运行;又或者说子进程先终止了,但是父进程一直没有调用wait或者waitpid,那么也只能等待父进程结束,然后子进程再自动把PID为1的进程(init)作为自己的父进程。这些子进程(僵尸进程)在被init发现后,便调用wait来释放他们。不过在这之前这些zombie一直占用着系统资源,所以编写程序的时候,注意在调用fork创建新的进程之后一定记得调用wait或者waitpid释放子进程占用的系统资源。
在上面的叙述中还提到了waitpid,它是另一个系统调用可以用来等待子进程的结束,可以用它来等待某个特定的进程结束、
  1. #include <sys/types.h>
  2. #include <sys/wait.h>

  3. pid_t waitpid(pid_t pid, int *stat_loc, int options);
复制代码
pid参数指定需要等待的子进程的PID,如果它的值为-1,waitpid将返回任一子进程的信息。与wait一样,如果stat_loc不是空指针,waitpid将把状态信息写到他所指向的位置。Option参数可用来改变waitpid行为,其中最有用的一个选项是WNOHANG,他的作用就是让父进程去检测有没有子进程结束,但是并不将自己挂起,如果有的话释放子进程的资源,可没有的话就继续运行咯。
所以比较实用的一种调用方法如下:
  1. waitpid(child_pid,(int *)0, WNOHANG);
复制代码
用来周期性的检测特定的子进程是否结束,如果子进程没有结束或者意外终止,它就返回0,否侧返回child_pid。如果waitpid失败,将返回-1,并设置errno。

这样对比起来,waitpid的使用还是相当灵活的。
论坛ID:yuanlai2010
发表时间:2014-08-07


最新回复

这样按步就搬的学习,基础会扎实一些!不错!加油!  详情 回复 发表于 2014-8-7 18:16
点赞 关注

回复
举报

554

帖子

0

TA的资源

版主

沙发
 
这样按步就搬的学习,基础会扎实一些!不错!加油!

点评

多谢BOSS的鼓励!  详情 回复 发表于 2014-8-7 21:33
 
个人签名My dreams will go on...
http://www.jyxtec.com
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

板凳
 
spacexplorer 发表于 2014-8-7 18:16
这样按步就搬的学习,基础会扎实一些!不错!加油!

多谢BOSS的鼓励!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表