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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。