暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux fork 后 wait 获取子进程结束的状态示例

进击的代码 2021-05-31
921

概览

使用 fork
后,可能需要获取 fork
的进程的运行状况,比如有没有异常、崩溃。

wait
在 man 中关键的描述如下:

All of these system calls are used to wait for state changes in a child of the calling process, and obtain information about the child whose state has changed. A state change is considered to be: the child terminated; the child was stopped by a signal; or the child was resumed by a signal.

示例代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void)
{
pid_t pid;
int status;

printf("before fork\n");
fflush(stdout);

if ( (pid = fork()) < 0)
{
printf("fork error\n");
}
else if (pid == 0)
{
printf("after fork, child\n");

// 4种测试情况
exit(7); // -> normal termination, exitstatus = 7
// abort(); -> abnormal termination, signalstatus = 6 (SIGABRT)
// int i = 1 0; -> abnormal termination, signalstatus = 8 (SIGFPE)
// char *p = NULL; *p = 'a'; -> abnormal termination, signalstatus = 11 (SIGSEGV)
}

wait(&status);

if (WIFEXITED(status))
{
printf("normal termination, exitstatus = %d\n", WEXITSTATUS(status));
}
else if (WIFSIGNALED(status))
{
printf("abnormal termination, signalstatus = %d\n", WTERMSIG(status),
#ifdef WCOREDUMP
WCOREDUMP(status)?"(core file generated)":"");
#else
"");
#endif
}
else if (WIFSTOPPED(status))
{
printf("child stopped, signal number = %d\n", WSTOPSIG(status));
}

printf("after fork, parent\n");

return 0;
}

复制

运行效果

文章转载自进击的代码,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论