如果进程的退出状态为0,则认为该进程已在Linux中正确完成。
我已经看到,分段错误通常会导致退出状态为11,尽管我不知道这仅仅是我工作的惯例(失败的应用程序都是内部的)还是标准的。
Linux中是否有用于进程的标准退出代码?
从wait(2)&co返回时,将8位返回码和8位终止信号编号混合为一个值。。
wait(2)
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <signal.h> int main() { int status; pid_t child = fork(); if (child <= 0) exit(42); waitpid(child, &status, 0); if (WIFEXITED(status)) printf("first child exited with %u\n", WEXITSTATUS(status)); /* prints: "first child exited with 42" */ child = fork(); if (child <= 0) kill(getpid(), SIGSEGV); waitpid(child, &status, 0); if (WIFSIGNALED(status)) printf("second child died with %u\n", WTERMSIG(status)); /* prints: "second child died with 11" */ }
您如何确定退出状态?传统上,外壳程序仅存储8位返回码,但如果进程异常终止,则将高位设置为高位。
$ sh -c'出口42'; 回声$? 42 $ sh -c'kill -SEGV $$'; 回声$? 分段故障 139 $ expr 139-128 11
如果您看到的不是这个,则程序可能有一个SIGSEGV信号处理程序,该信号处理程序随后exit会正常调用,因此实际上并没有被信号杀死。(程序可以选择处理SIGKILL和以外的任何信号SIGSTOP。)
SIGSEGV
exit
SIGKILL
SIGSTOP