linux wait中文手册,Linux wait函数详解

Linux wait函数详解

wait和waitpid出现的原因

SIGCHLD

--当子进程退出的时候,内核会向父进程SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止)

--子进程退出时,内核将子进程置为僵尸状态,这个进程成为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态

--父进程查询子进程的退出状态可以用wait/waitpid函数

wait获取staus后检测处理

宏定义 描述

WIFEXITED(status) 如果进程子进程正常结束,返回一个非零值

WEXITSTATUS(status) 如果WIFEXITED非零,返回子进程退出码

WIFSIGNALED(status) 子进程因为捕获信号而终止,返回非零值

WTERMSIG(status) 如果WIFSIGNALED非零,返回信号代码

WIFSTOPPED(status) 如果进程被暂停,返回一个非零值

WSTOPSIG(status) 如果WIFSTOPPED非零,返回信号代码

#include

#include

#include

#include

#include

#include

#include

int main(int arg,char *args[])

{

pid_t pid=fork();

if(pid==-1)

{

printf("fork() failed ! error message:%s

",strerror(errno));

return -1;

}

if(pid>0)

{

int status=0;

printf("父进程

");

wait(&status);

if(WIFEXITED(status))//WIFEXITED宏的释义: wait if exit ed

{

printf("子进程返回信息码:%d

",WEXITSTATUS(status));

}else if(WIFSIGNALED(status))

{

printf("子进程信号中断返回信息码:%d

",WTERMSIG(status));

}else if(WIFSTOPPED(status))

{

printf("子进程暂停返回信息码:%d

",WSTOPSIG(status));

}else

{

printf("其他退出信息!

");

}

}else if(pid==0)

{

printf("i am child !

");

abort();

//exit(100);

}

printf("game is over!

");

return 0;

}

wait()函数成功返回等待子进程的pid,失败返回-1

#include

#include

#include

#include

#include

#include

#include

int main(int arg, char *args[])

{

pid_t pid = 0;

int i = 0, ret = 0;

for (i = 0; i < 10; i++)

{

pid = fork();

if (pid == -1)

{

printf("fork() failed ! error message:%s

", strerror(errno));

return -1;

}

if (pid == 0)

{

printf("child haved run!

");

exit(0);

}

}

while (1)

{

//wait()函数的返回值是子进程的pid

ret = wait(NULL);

printf("子进程pid=%d

", ret);

if (ret == -1)

{

//父进程wait()函数阻塞过程中,有可能被别的信号中断,需要做异常处理

if (errno == EINTR)

{

continue;

}

break;

}

}

printf("game is over!

");

return 0;

}

waitpid

函数功能:用来等待某个特定进程的结束

函数原型:

pid_t waitpid(pid_t pid, int *status, int options);

参数:

status如果不为空,会把状态信息写到它指向的位置

options允许改变waitpid的行为,最有用的一个选项是WNOHANG,它的作用是防止waitpid把调用者的执行挂起

返回值:成功返回等待子进程的pid,失败返回-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值