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\n",
                WEXITSTATUS(status));
    else if (WIFSIGNALED(status))
        printf("abnormal termination, signal number = %d%s\n",
                WTERMSIG(status),
#ifdef WCOREDUMP
                WCOREDUMP(status) ? " (core file generated)" : "");
#else
    "");
#endif
    else if (WIFSTOPPED(status))
        printf("child stopped, signal number = %d\n",
                WSTOPSIG(status));
}
  • WIFEXITED(status)如果为真,那么表示子进程正常返回,我们通过执行WEXITSTATUS(status)获取返回值。

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

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

posted @ 2015-06-22 15:57 tracyone 阅读(...) 评论(...) 编辑 收藏