来源:http://hohahohayo.blog.163.com/blog/static/120816010200971210230362/

wait(等待子进程中断或结束)
表头文件
     #include<sys/types.h>
     #include<sys/wait.h>
  定义函数 pid_t wait (int * status);
  函数说明:
      wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。

      如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。
      子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回。
      如果不在意结束状态值,则参数 status 可以设成 NULL。
      子进程的结束状态值请参考 waitpid( )     
    如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回返回值-1。失败原因存于 errno 中。
waitpid(等待子进程中断或结束)
  表头文件
      #include<sys/types.h>
      #include<sys/wait.h>
  定义函数  pid_t waitpid(pid_t pid,int * status,int options);
  函数说明:
      waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
      如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。
      子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一快返回。
      如果不在意结束状态值,则参数 status 可以设成 NULL。
 
参数 pid 为欲等待的子进程识别码,其他数值意义如下:
     pid<-1 等待进程组识别码为 pid 绝对值的任何子进程。
     pid=-1 等待任何子进程,相当于 wait()。            
     pid=0     等待进程组识别码与目前进程相同的任何子进程。       
     pid>0     等待任何子进程识别码为 pid 的子进程。
参数 option 可以为 0 或下面的 OR 组合:
    WNOHANG 如果没有任何已经结束的子进程则马上返回, 不予以等待。
    WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
    子进程的结束状态返回后存于 status,底下有几个宏可判别结束情况:
    WIFEXITED(status)如果子进程正常结束则为非 0 值。
    WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用 WIFEXITED 来判断是否正常结束才能使用此宏。
    WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真
    WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才使用此宏。
    WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为真。一般只有使用 WUNTRACED 时才会有此情况。
    WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才使用此宏。
    如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回返回值-1。失败原因存于 errno 中。

 /******
* waitpid.c - Simple wait usage
*********/ #include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h> int main( void )
{
pid_t childpid;
int status; childpid = fork(); if ( - == childpid )
{
perror( "fork()" );
exit( EXIT_FAILURE );
}
else if ( == childpid )
{
puts( "In child process" );
sleep( );//让子进程睡眠3秒,看看父进程的行为
printf("\tchild pid = %d\n", getpid());
printf("\tchild ppid = %d\n", getppid());
exit(EXIT_SUCCESS);
}
else
{
waitpid( childpid, &status, );
puts( "in parent" );
printf( "\tparent pid = %d\n", getpid() );
printf( "\tparent ppid = %d\n", getppid() );
printf( "\tchild process exited with status %d \n", status );
}
exit(EXIT_SUCCESS);
}

[root@localhost src]# gcc waitpid.c 
[root@localhost src]# ./a.out 
In child process
        child pid = 4469
        child ppid = 4468
in parent
        parent pid = 4468
        parent ppid = 4379
        child process exited with status 0 
[root@localhost src]#

如果将上面“waitpid( childpid, &status, 0 );”行注释掉,程序执行效果如下:
[root@localhost src]# ./a.out 
In child process
in parent
        parent pid = 4481
        parent ppid = 4379
        child process exited with status 1331234400 
[root@localhost src]#   child pid = 4482
        child ppid = 1

子进程还没有退出,父进程已经退出了。

最新文章

  1. Lasso回归算法: 坐标轴下降法与最小角回归法小结
  2. 安卓自动化测试:Android studio 自带的 Record Espresso Test || [ Appium &amp; (Android studio || Python|| Eclipse ) ]
  3. windows 10环境下 使用 msys2 + vs code 配置 c++ 的编译环境
  4. SQL server 2008数据库的备份与还原(转)
  5. 安装MVC3后没有dbcontext生成器的解决方案
  6. Java编程常见问题汇总
  7. HDU 1498 50 years, 50 colors
  8. 【linux驱动笔记】linux模块机制浅析
  9. 在VC下显示JPEG、GIF格式图像的一种简便方法
  10. 修改IP的方法(C#)
  11. list,set,map总结
  12. 线性回归(Linear Regression)均方误差损失函数最小化时关于参数theta的解析解的推导(手写)
  13. 使用IIS应用程序初始化来保持ASP.NET应用程序的活动
  14. 课程回顾-Structuring Machine Learning Projects
  15. 【Math for ML】向量微积分(Vector Calculus)
  16. Gym 102056L - Eventual … Journey - [分类讨论][The 2018 ICPC Asia-East Continent Final Problem L]
  17. GreenDao存储自定义类型对象解决方案(转)
  18. redis安装启动和数据操作
  19. 面向对象设计原则 里氏替换原则(Liskov Substitution Principle)
  20. 【Smali】Smali文件的动态调试

热门文章

  1. C# 判断是否移动设备
  2. 技术杂记之:vi使用入门
  3. 锐动SDK置于社区沙龙
  4. linux下mysql开启可访问
  5. vscode增加xdebug扩展
  6. 契约式设计(DbC)感想(二)
  7. 原生jsonp跨域
  8. WindowsService+Quartz.NET快速搭建
  9. swift class extension 与继承
  10. COMMENT - 定义或者改变一个对象的评注