zoukankan      html  css  js  c++  java
  • Unix系统中system函数的返回值

    网上关于system函数的返回值说明很多很详细但却不直观,这里搬出apue 3rd Editon中实现system函数的代码来说明其返回值。

    #include <sys/wait.h>
    #include <errno.h>
    #include <unistd.h>
    
    int system(const char *cmdstring)
    {
        pid_t
            pid;
        int
            status;
        /* version without signal handling */
        if (cmdstring == NULL)
            return(1);
        /* always a command processor with UNIX */
        if ((pid = fork()) < 0) {
            status = -1;
            /* probably out of processes */
        } else if (pid == 0) {
            /* child */
            execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
            _exit(127);
            /* execl error */
        } else {
            /* parent */
            while (waitpid(pid, &status, 0) < 0) {
                if (errno != EINTR) {
                    status = -1; /* error other than EINTR from waitpid() */
                    break;
                }
            }
        }
        return(status);
    }
    
    

    其中waitpid函数将子进程函数的返回值存储于status变量中作为最后返回,该返回值又若干位组成不同位代表不同的退出状态,子进程返回可能是正常返回,可能是abort,可能是产生core文件....

    我们可以在<sys/wait.h>头文件中找到若干宏定义来定位子进程的退出状态。

    #include "apue.h"
    #include <sys/wait.h>
        void
    pr_exit(int status)
    {
        if (WIFEXITED(status))
            printf("normal termination, exit status = %d
    ",
                    WEXITSTATUS(status));
        else if (WIFSIGNALED(status))
            printf("abnormal termination, signal number = %d%s
    ",
                    WTERMSIG(status),
    #ifdef WCOREDUMP
                    WCOREDUMP(status) ? " (core file generated)" : "");
    #else
        "");
    #endif
        else if (WIFSTOPPED(status))
            printf("child stopped, signal number = %d
    ",
                    WSTOPSIG(status));
    }
    
    
    • WIFEXITED(status)如果为真,那么表示子进程正常返回,我们通过执行WEXITSTATUS(status)获取返回值。

    • WIFSIGNALED(status)如果为真表面该子进程接收到某信号导致其abort,我们执行WTERMSIG(status)获取该导致该子进程退出的信号。

    • WIFSTOPPED(status) 如果为真表面该子进程当前处于暂停状态,通过执行WSTOPSIG(status)获得导致该进程暂停的信号。

  • 相关阅读:
    列出python中可变数据类型和不可变数据类型,并简述原理
    python 字典操作
    Python的is和==
    python2和python3区别
    下面的代码在Python2中的输出是什么?解释你的答案
    编程用sort进行排序,然后从最后一个元素开始判断,去重
    如何在一个function里面设置一个全局的变量?
    用Python匹配HTML tag的时候,<.>和<.?>有什么区别?
    请写出一段Python代码实现删除一个list里面的重复元素
    什么是lambda函数?它有什么好处?
  • 原文地址:https://www.cnblogs.com/tracyone/p/4593395.html
Copyright © 2011-2022 走看看