CSAPP——linux下的 status 函数及进程退出/进程回收详解
2023-12-13 16:21:46
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会直接退出进程,不管缓冲区的数据等。
为啥信号又有信号又有退出码?????????????????????????????????????????
文章来源:https://blog.csdn.net/weixin_53432918/article/details/134896011
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!