linux应用程序中,如何运行可执行程序,并获取其返回值?参考代码如下:
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
/*
*****************************************************************************************
* 函 数 名: main
* 功能说明: 创建子进程运行可执行程序,并获取其返回值
* 形 参:无
* 返 回 值: 非-1:子进程返回值
* -1:失败
*****************************************************************************************
*/
int main(void)
{
int ret = 0;
int status;
/* 创建子进程运行可执行程序,并获取其返回值 */
pid_t child = fork();
if (child == 0) { //子进程
execl("./donga_test", NULL); //运行可执行程序
printf("run_program: execv failed: %s\n", strerror(errno));
_exit(-1);
}
waitpid(child, &status, 0); //等待子进程执行结束
if (WIFEXITED(status)) { //非0表明子进程正常结束
if (WEXITSTATUS(status) != 0) {
printf("run_program: child exited with status %d\n", WEXITSTATUS(status));
ret = WEXITSTATUS(status); //子进程返回值
} else {
ret = 0;
}
} else if (WIFSIGNALED(status)) { //判断子进程异常退出
printf("run_program: child terminated by signal %d\n", WTERMSIG(status));
ret = -1;
} else {
ret = 0;
}
return ret;
}
1. WIFEXITED(status) 指出子进程是否为正常退出的,非0表明进程正常结束。
进程正常结束时,WEXITSTATUS(status) 可提取子进程的返回值。例如:如果子进程调用exit(5)退出,WEXITSTATUS(status)就会返回5。请注意,如果进程不是正常退出的,也就是说,WIFEXITED返回0,这个值就毫无意义。
if(WIFEXITED(status)){
printf("返回值:%d\n", WEXITSTATUS(status));
}
2. WIFSIGNALED(status)为非0表明进程异常终止。
进程异常终止时,WTERMSIG(status)获取使得进程退出的信号编号。
if(WIFSIGNALED(status)){
printf("使进程异常终止的信号编号:%d\n", WTERMSIG(status));
}