- 论坛徽章:
- 0
|
相信很多人看《unix环境高级编程》都看过下面的代码,
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <errno.h>
#include <math.h>
void main(void)
{
pid_t child;
int status;
printf("This will demostrate how to get child status\n");
if((child=fork())==-1) {
printf("Fork Error :%s\n",strerror(errno));
exit(1);
}
else if(child==0) {
int i;
printf("I am the child:%ld\n",getpid());
for(i=0;i<1000000;i++) sin(i);
i=5;
printf("I exit with %d\n",i);
exit(i);
}
while(((child=wait(&status))==-1)&(errno==EINTR));
if(child==-1)
printf("Wait Error:%s\n",strerror(errno));
else if(!status)
printf("Child %ld terminated normally return status is zero\n",child);
else if(WIFEXITED(status))
printf("Child %ld terminated normally return status is %d\n",child,WEXITSTATUS(status));
else if(WIFSIGNALED(status))
printf("Child %ld terminated due to signal %d znot caught\n", child,WTERMSIG(status));
}
|
wait函数后,要取得子进程返回值用函数WEXITSTATUS(status),以前一直没注意,刚刚发现当子进程返回值为负数时候有问题,查看该函数宏定义:
#define WEXITSTATUS(sv) ((sv >> 8 & 0xff) |
本人觉得应该该为:
#define WEXITSTATUS(sv) ((sv >> 8 & ~0) |
测试了几次结果都正确,大家帮忙看看是不是这样。
[ 本帖最后由 rock_jq 于 2008-4-25 21:54 编辑 ] |
|