linux进程编程(二)-- waitpid()函数使用
2016-07-31 16:00
645 查看
函数简介
函数原型#include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid, int *status, int options);
描述
waitpid()会挂起调用的进程,直到由参数
pid指定的子进程状态改变,一默认情况下,只等待子进程的退出,可以通过
options参数进行修改。
参数
pid- 进程的pid,pid的取值不同实际意义也会不同:
< -1等待进程组中的任何子进程退出,进程组的ID为pid的绝对值
-1等待任何子进程,此时与wait函数的作用相同(常用)
0等待与调用进程为同一进程组的任何子进程退出
> 0等待进程ID为pid的子进程退出
status- 如果不为NULL,则存储状态信息,常用值(详细请参考man waitpid):
WIFEXITED(status)返回true如果进程正常退出,也就是说调用exit或main函数退出
WEXITSTATUS(status)获取子进程的退出信息,只有在WIFEXITED返回true时有效
WIFSIGNALED(status)返回true如果进程被信号终端
WTERMSIG(status)获取引起子进程退出的信号值,只有在WIFSIGNALED返回true时有效
options- 可以为0,或以下选项的逻辑组合:
WNOHANG即使没有子进程退出,也会立即返回
WUNTRACED子进程被挂起是也会返回
WCONTINUED子进程被恢复是也会返回
返回值
返回状态改变的子进程的pid,如果设置了
WNOHANG选项则如果当前没有退出的子进程可收集的时候返回0,如果错误则返回-1。
实例
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #define CREATE_PROCESS_CNT 5 int main(void) { pid_t pid; int i; int status; for(i = 0; i < CREATE_PROCESS_CNT; i++) { pid = fork(); switch(pid) { case -1: /*error*/ perror("fork"); exit(1); break; case 0: /*child*/ printf("I am child, exit status:%d pid:%d ppid:%d\n", i, getpid(), getppid()); exit(i); break; default: /*parent*/ break; } } sleep(1); //make sure all children had exited, before. i = 0; for( ;; ) { pid = waitpid(-1, &status, WNOHANG); if(pid == 0) { /* no child*/ printf("no child to be waited\n"); sleep(1); } if(pid > 0) { printf("collected child pid[%d] exit status is %d\n", pid, WEXITSTATUS(status)); i++; if(i == CREATE_PROCESS_CNT) { printf("all children had exited\n"); exit(0); } } if(pid == -1) { perror("waitpid"); exit(1); } } return 0; }
相关文章推荐
- linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用
- linux进程编程(三)-- execl()函数使用
- linux系统编程之进程(七):system()函数使用
- linux进程编程-替换进程映-exec系列函数(execl,execlp,execle,execv,execvp)使用
- Linux系统进程控制编程(一)————基本概念和函数getpid的使用
- Linux系统进程控制编程(六)——wait和waitpid函数
- [Linux进程]使用waitpid函数退出进程
- linux进程编程-替换进程映-exec系列函数(execl,execlp,execle,execv,execvp)使用
- linux系统编程之进程(四):wait/waitpid函数与僵尸进程、fork 2 times
- linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用
- linux进程编程,exec系列函数(execl,execlp,execle,execv,execvp)使用
- Linux下的多进程编程——fork(),exec()等函数的使用
- linux系统编程之进程(七):system()函数使用
- linux系统编程之进程(七):system()函数使用
- Linux下多进程编程之exec函数语法及使用实例
- Linux下的多进程编程(转) - fork(),exec()等函数的使用[zz]
- 进程函数一步步理解Linux进程(2)--进程编程
- Linux 下进程控制编程——vfork()使用
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
- Linux多任务编程(五)---wait()、waitpid()函数及其基础实验