父进程查询子进程的退出状态可以用wait/waitpid函数。
wait系统调用会使父进程暂停执行直到它的一个子进程结束为止。
返回的是子进程的PID,它通常是结束的子进程
状态信息允许父进程判定子进程的退出状态,即从子进程的main函数返回的值或子进程中exit语句的退出码。
如果status不是一个空指针,状态信息将被写入它指向的位置。
宏定义 | 描述 |
WIFEXITED(status) | 如果子进程·正常结束,返回一个非零值 |
WEXITSTATUS(status) | 如果WIFEXITED非零,返回子进程退出码 |
WIFSIGNALED(status) | 子进程因为捕获信号而终止,返回非零值 |
WTERMSIG(status) | 如果WTFSIGNALED非零,返回信号代码 |
WIFSTOPPED(status) | 如果子进程被暂停,返回一个非零值 |
WSTOPSIG(status) | 如果WIFSTOPPED非零,返回一个信号代码 |
wait
头文件<sys/types.h>和<sys/wait.h>
函数功能:
当我们用fork启动一个进程时,子进程就有了自己的生命,并将独立地运行。有时,我们需要知道某个子进程是否已经结束了,我们可以通过wait安排父进程在子进程结束之后。
函数原型:
pid_t wait(int *status)
函数参数
status:改参数可以获得你等待子进程的信息
返回值:
成功等待子进程函数返回等待子进程的ID
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>
#include <signal.h>
#include <sys/wait.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}while(0)
int main()
{
pid_t pid;
pid = fork();
if(pid == -1)
{
ERR_EXIT("fork error");
}
if(pid == 0)
{
sleep(5);
printf("this is child\n");
exit(100);
}
printf("this is parent\n");
int status;
wait(&status);
return 0;
}
运行的结果是子进程先退出,父进程在退出。
解释一下代码:
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}while(0)
这是一个宏函数,作用是当发生错误的时候回提示出错。
pid_t pid;
pid = fork();
这组代码是创建一个子进程。pid_t 是数据类型,进程号,是int类型。当pid为0 的时候说明是子进程。当pid大于0的时候是父进程。pid为-1的时候是创建进程失败。
if(pid == 0)
{
sleep(5);
printf("this is child\n");
exit(100);
}
这组代码是在子进程中执行的,sleep(5)意思是想让父进程先执行完。exit(100);这行代码的意思是子进程执行到这里就退出了。不会执行下面的代码。
printf("this is parent\n");
int status;
wait(&status);
这组代码是在父进程中执行的。
wait(&status)这个是在等待子进程执行。
所以结果是先输出
但是代码在这里阻塞了,一直等待
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>
#include <signal.h>
#include <sys/wait.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}while(0)
int main()
{
pid_t pid;
pid = fork();
if(pid == -1)
{
ERR_EXIT("fork error");
}
if(pid == 0)
{
sleep(5);
printf("this is child\n");
exit(100);
}
printf("this is parent\n");
int ret;
int status;
ret = wait(&status);
printf("ret = %d, pid = %d\n",ret,pid);
return 0;
}
子进程执行完才退出。
waitpid
函数功能:
用来等待某个特定进程的结束
函数原型:
pid_t waitpid(pid_t pid,int * status,int options)
参数:
status如果不是空,会把状态信息写到它指向的位置。
options允许改变waitpid的行为,最有用的一个选项是WNOHANG,它的作用是防止waitpid吧调用者的执行挂起
返回值:
如果成功返回等待子进程的ID,失败返回-1
对于waitpid的pid参数的解释与其值有关:
pid==-1等待任一子进程。于是在这一方面功能方面waitpid与wait等效。
pid>0等待其进程ID与pid相等的子进程。
pid==0等待其组ID等于调用的组ID的任一子进程。换句话说是与调用者进程同在一个组的进程。
pid<-1 等待其组ID等于pid的绝对值得任一子进程。
wait和waitpid的区别
在一个子进程终止前,wait使用其调用者阻塞,而waitpid有一选项,可使调用者不阻塞。
waitpid并不等于第一个终止的子进程-它有若干个选项,可以控制它所等待的特定进程。
实际上wait函数是waitpid函数的一个特例。