如何解决C、wait()返回什么进程?
假设我在 main 中写了以下内容:
int main() {
int status;
if ((p1 = fork()) != 0) {
if ((p2 = fork()) != 0) {
wait(&status);
wait(&status);
} else {
processB();
}
}
return 3;
}
加:
int processB() {
return 1;
}
当进程 p2 结束时,它保存在 &status 中的值是多少?
例如,如果它使用 exit(100) 结束,那么它将返回 100,但我不知道在这种情况下会发生什么?
解决方法
进程的退出状态以 16 位编码。高 8 位包含来自 main()
的返回值或传递给 exit()
(或其亲属之一)的值;低位 8 位包含终止进程的信号和指示创建核心转储的标志。如果进程正常退出,低位为零。 wait()
的返回值是死进程的 PID。
使用类似的代码以半清晰的格式打印出信息:
int corpse;
int status;
while ((corpse = wait(&status)) > 0)
printf("PID %5d exited with status 0x%.4X\n",corpse,status);
如果你的程序在 return 3;
的末尾有 main()
,那么通过状态指针报告给 wait()
的值将是 0x0300
(768 = 3 * 256) .如果您的程序调用 exit(100);
,则 wait()
返回的值将为 0x6400 (100 = 6 * 16 + 4)。如果您的程序被中断 (SIGINT,2) 杀死,则 wait()
返回的值将为 0x0002。 (从技术上讲,实际值取决于系统,但这在历史上是准确的,我知道没有哪个系统不会发生这种情况。)
另见ExitCodes bigger than 255 — Possible?。
POSIX 定义了 <sys/wait.h>
带有一堆相关宏的标题,例如:
WIFEXITED
WEXITSTATUS
WIFSIGNALED
WTERMSIG
WIFSTOPPED
WSTOPSIG
并且实现通常定义一个宏来检测核心转储——通常是 WCOREDUMP
。
另请参阅 wait()
的 POSIX 规范
(也指定了 waitpid()
)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。