status函数是一个系统调用,用于获取子进程的退出状态。它通常在父进程中使用,以便检查子进程是否正常退出或出现错误。
status函数的原型如下:
int waitpid(pid_t pid, int *status, int options); pid参数指定要等待的子进程的进程ID
status参数是一个指向整数的指针,用于存储子进程的退出状态
options参数指定等待子进程的行为。
status函数的返回值为子进程的进程ID,如果出现错误,则返回-1。
status函数的使用方法如下:
int main()
{ pid_t pid; int status; pid = fork(); if (pid == 0) { // 子进程 printf("Child process\n"); exit(0); } else if (pid > 0) { // 父进程 waitpid(pid, &status, 0); if (WIFEXITED(status)) { printf("Child process exited with status %d\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("Child process terminated by signal %d\n", WTERMSIG(status)); } } else { // 出错 perror("fork"); exit(1); } return 0;
} 首先创建一个子进程,然后在父进程中使用waitpid函数等待子进程的退出状态。
如果子进程正常退出,WIFEXITED(status)将返回true,并使用WEXITSTATUS(status)获取子进程的退出状态。
如果子进程被信号终止,WIFSIGNALED(status)将返回true,并使用WTERMSIG(status)获取终止信号的编号。status函数是Linux中非常重要的一个函数,它可以帮助我们检查子进程的退出状态,从而保证程序的正确性和稳定性。
进程等待所使用的两个函数wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统进行填充。
如果对status参数传入NULL,表示不关心子进程的退出状态信息。否则,操作系统会通过该参数,将子进程的退出信息反馈给父进程。
仅使用 int 型 status 低16 位数据:
正常退出:获取高 8 位退出码
被信号所杀:获取低 7 位终止信号
使用宏来查看:
WIFEXITED(status):用于查看进程是否是正常退出,本质是检查是否收到信号。WEXITSTATUS(status):用于获取进程的退出码。
exitNormal = WIFEXITED(status); //是否正常退出
exitCode = WEXITSTATUS(status); //获取退出码
进程退出码
int main(){return 0; }
上方代码的0就是进程退出码之一,表示程序正确执行。0表示程序执行完了结果正确,其余数字都表示结果不正确。
string.h库中有一个strerror函数,可以将我们的进程退出码的信息以文字方式表示出来。
调用 exit() 函数或 _exit() 函数结束进程
exit("退出码");
_exit("退出码");
_exit是一个系统接口,而exit是stdio.h库提供的一个库函数。
并且exit函数内部调用的_exit函数,且exit函数调用没有_exit函数暴力,它会先将前面执行的代码运行完了才结束进程,而_exit会直接退出进程,不管缓冲区的数据等。
为啥信号又有信号又有退出码?????????????????????????????????????????