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