源自:
system函数,pclose函数,waitpid函数的返回值是什么?
system(),pclose()或者waitpid()的返回值不象是我进程的退出值(exit value).
(译者注:退出值指调用exit() 或_exit()时给的参数)... 或者退出值左移了8 位...这是怎么搞的?
手册页是对的,你也是对的! 如果查阅手册页的‘waitpid()’你会发现进程的返回值被编码了。
正常情况下,进程的返回值在高16位,而余下的位用来作其它事。
如果你希望可移植,你就不能凭借这个,而建议是你该使用提供的宏。
这些宏总是在‘wait()’或‘wstat’的文档中说明了。
为了不同目的定义的宏(在‘
’)包括(stat是‘waitpid()’返回的值):
`WIFEXITED(stat)'
如果子进程正常退出则返回非0
`WEXITSTATUS(stat)'
子进程返回的退出码
`WIFSIGNALED(stat)'
如果子进程由于信号而终止则返回非0
`WTERMSIG(stat)'
终止子进程的信号代码
`WIFSTOPPED(stat)'
如果子进程暂停(stopped)则返回非0
`WSTOPSIG(stat)'
使子进程暂停的信号代码
`WIFCONTINUED(stat)'
如果状态是表示子进程继续执行则返回非0
`WCOREDUMP(stat)'
如果‘WIFSIGNALED(stat)’为非0,而如果这个进程产生一个内存映射文件
(core dump)则返回非0
当时的程序:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
int status;
pid = fork();
if(pid < 0)
{
return -1;
}
else if(pid == 0)
{
execl("/bin/sh", "sh", "-c", "ls", NULL);
fprintf(stderr,"Something is wrong!\n");
}
waitpid(-1,&status,0);
//以前这里直接 printf("Exit status:%d\n", status);得到的结果不对
if(WIFEXITED(status) == 0)
{
printf("Exit abnormity\n");
return -1;
}
printf("Exit status:%d\n",(int)WEXITSTATUS(status) );
return 0;
}
|
阅读(2647) | 评论(0) | 转发(0) |