void handler(int sig){
printf("this is handler : %d\n",sig);
}
int main(){
int status;
pid_t pid;
pid=fork();
if ( pid < 0)
return -1;
else if(0 == pid){
printf("child : %d\n",getpid() );
//execl("/bin/sh","sh","-c","pwd",NULL);
exit(255);
}else{
//signal(SIGCHLD, handler);
printf("parent : %d\n",getpid() );
pid = wait(&status);
if(WIFEXITED(status)){
printf("xxx %d\n", status);
printf("Child process PID [%d] return [%d].\n", pid, WEXITSTATUS(status));
printf("xxx %d\n", status);
}
else{
printf("Child terminated abnormally\n");
}
}
}
运行结果:
parent : 145030
child : 145031
xxx 65280
Child process PID [145031] return [255].
xxx 65280
结论:
- wait()函数可以接受子进程的返回值,但要经过WEXITSTATUS宏的解释。
- 在调用WEXITSTATUS之前,应该先判断WIFEXITED为true。
- exit()返回的值不能超过255,否则会溢出。因为参数类型是int,高16位才用来实际存储返回值,而低16位为0. 至于为何如此,man手册指出:exit函数的实际返回值是 status & 0377 ,但仍然看不出究竟,个中原因尚不明确,还请高手指点。
- 注释掉的excel函数困扰我很久,没注释之前wait总是拿到子进程的返回值一直是0,一查才想起来excel函数族会替换掉原有进程的正文。换而言之,excel之后的代码段再也没有机会执行了。再换个角度,进程默认退出的返回值确实为0。