system()与WIFEXITED/WEXITSTATUS/WIFSIGNALED

system()用于执行shell命令


头文件

        #i nclude

函数定义

        int system(const char *command) ;

函数说明

        system()会调用fork()产生子进程,由子进程来调用/bin/sh-c command来执行参数command字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用

system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。

返回值

=-1:出现错误 

=0:调用成功但是没有出现子进程 

>0:成功退出的子进程的id


子进程的结束状态返回后存于status,底下有几个宏可判别结束情况

WIFEXITED(status)如果子进程正常结束则为非0值。

WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。

WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真

WTERMSIG(status)取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。

WIFSTOPPED(status)如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。

WSTOPSIG(status)取得引发子进程暂停的信号代码


举个例子:

int status;

status= system("ls -l");

/*需检测system()返回值*/
if(WIFSIGNALED(status) && (WTERMSIG(status)==SIGINT || WTERMSIG(status)==SIGQUIT))
;

printf(" WIFEXITED is %d ", WIFEXITED(status));

printf("WEXITSTATUS is %d ",WEXITSTATUS(status)); //获取shell命令执行完成的返回值

printf("WIFSIGNALED is %d ",WIFSIGNALED(status));

printf("WTERMSIG is %d ",WTERMSIG(status));

printf("WIFSTOPPED is %d ",WIFSTOPPED(status));

printf("WSTOPSIG is %d ",WSTOPSIG(status));

你可能感兴趣的:(Linux)