进程控制-wait()和waitpid()函数
来源:互联网 发布:web系统数据暂存 编辑:程序博客网 时间:2024/06/05 04:09
首先我们来看看调用wait()和waitpid()会发生什么。
- 如果其所以子进程都还在运行,则阻塞。
- 如果一个子进程已终止,正等待父进程获取其终止进程,则取得该子进程的终止状态立即返回。
- 如果它没有任何子进程,则立即出错返回。
另外,要知道当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。而如果父进程由于接受到SIGCHLD信号而调用wait,我们期望wait会立即返回。如果在随机时间点调用wait,则进程会阻塞。
函数头文件及声明:
#include<sys/wait.h>pid_t wait(int *statloc);pid_t waitpid(pid_t pid,int *statloc,int options);
两函数如果成功,返回进程ID;若出错返回0或-1;
这两个函数的区别如下:
- 在一个子进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。
- waitpid并不等待在其调用之后的第一个终止进程,它有若干个选项,可以控制它所等待的进程。
如果子进程已经终止,并且是僵死进程,那么wait立即返回并取得该子进程的状态;否则wait使其调用者也就是父进程阻塞,直到一个子进程终止。如果调用者阻塞,而调用者有很多子进程,那么就在其某一子进程终止时,wait就立即返回。
现在我们来看看这两个函数的参数
它们的参数中都有一个整形指针statloc。如果statloc不是空,则终止进程的终止状态就存放在它所指向的单元内。如果不关心终止状态,则可以将该参数制定为空,比如wait(NULL);
waitpid()参数中pid的作用:
这里,对于wait,如果父进程调用进程没有子进程,则会出错。对于waitpid,如果制定的进程不存在,或者参数pid指定的进程不是子进程,都可能会出错。
参数options,这个参数让我们可以进一步的控制waitpid的操作。
waitpid非阻塞实例:
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/wait.h> #include<sys/types.h> int main(void) { pid_t pc,pr; pc=fork(); if(pc<0) { printf("Error fork \n"); } else if(pc==0) { sleep(5); exit(0); } else { do { pr=waitpid(pc,NULL,WNOHANG); if(pr==0) { printf("The child process has not exited \n"); sleep(1); } }while(pr==0); if(pr==pc) { printf("Get child exit code: %d\n ",pr); } else { printf("Some error occured. \n"); } } return 0; }
waitpid与wait:
1)waitpid可等待一个特定的进程,而wait则返回任一个终止子进程的状态。
2)waitpid提供一个wait的非阻塞版本。
3)waitpid通过WUNTRACED和WCNOTINUED支持作业控制。
阅读全文
0 0
- 进程控制-wait()和waitpid()函数
- 进程控制之exit和waitpid(wait)函数
- 进程控制之exit和waitpid(wait)函数
- 第8章(2) 进程控制 -函数wait和waitpid
- 僵尸进程以及wait和waitpid函数
- Linux系统进程控制编程(六)——wait和waitpid函数
- Linux系统进程控制编程——wait和waitpid函数
- wait 和waitpid函数
- wait和waitpid函数
- wait() 和waitpid() 函数
- wait和waitpid函数
- wait和waitpid函数
- wait和waitpid函数
- wait和waitpid函数
- wait()和waitpid()函数
- 函数wait和waitpid
- wait和waitpid函数
- wait和waitpid函数
- Redis分布式锁,开发实战
- Android 字符串加载资源问题
- 常见对象-BigInteger
- JDBC调用存储过程
- 座右铭
- 进程控制-wait()和waitpid()函数
- springmvc简单配置及测试
- 指针与内存管理初步
- 遍历二叉查找树
- Handler使用总结
- MySQL学习笔记-安装和基本操作
- 杭电水题2000 ( ASCII码排序 )
- 聊聊NSURLSession
- linux常用命令之连接mysql