• 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)获得导致该进程暂停的信号。

  • 相关阅读:
    HDU 2853 (KM最大匹配)
    HDU 2852 (树状数组+无序第K小)
    HDU 2851 (最短路)
    HDU 2846 (AC自动机+多文本匹配)
    MyBatis使用示例
    Hessian示例:Java和C#通信
    SQL Server2005配置同步复制
    【问】如何应对关系型数据库中列的不断增加
    Prolog学习:数独和八皇后问题
    Prolog学习:基本概念
  • 原文地址:https://www.cnblogs.com/tracyone/p/4593395.html
Copyright © 2020-2023  润新知