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

  • 相关阅读:
    NX二次开发-UFUN根据矩阵移动或复制对象uf5947
    NX二次开发-UFUN判断两个向量是否相等UF_VEC3_is_equal
    移动端开发小技巧
    echarts对后端返回的数据进行处理
    Vue router / Element 重复点击导航路由报错解决方法
    谷歌浏览器设置跨域问题
    setLocalStorage的存入与读取
    关于layui中数据表格的使用心得
    npm scss安装错误
    鼠标右键获取页面的坐标
  • 原文地址:https://www.cnblogs.com/tracyone/p/4593395.html
Copyright © 2011-2022 走看看