【by lanmanck】
創建子進程一般用fork,因為用execv后就不返回了,父進程無法跟子進程通信。
這里有個例子:
http://blog.csdn.net/wallwind/article/details/6998602
父進程fork后,可以使用wait和wait_pid來等待子進程結束,wait/wait_pid可以阻塞也可以不阻塞,權威解析在這里:
http://linux.die.net/man/3/wait
示例代碼修改一下:
#include "stdio.h"
#include"stdlib.h"
#include
#include
#include
int main(void)
{
int child_ret;
pid_t pid1,pid2;
printf("before fork\n");
if((pid1=fork())<0){
printf("fork error");
}else if(pid1==0){
printf("child process's pid=%d,sleep 3 sec\n",getpid());
sleep(3);
exit(-3); //line19
}else{
printf("parent process wait child terminate...\n");
pid2=wait(&child_ret);
printf("wait process's pid=%d,status=0x%X,exit value=%d(0x%X)\n",pid2,child_ret,
WEXITSTATUS(child_ret),WEXITSTATUS(child_ret));
}
exit(0);
}
我們主要關注line19,因為用
pid2=wait(&child_ret);
等待后,主要就是看child_ret的值,這樣父進程好做進一步判斷;
通過打印得知:
1、如果子進程調用exit(val);退出,則child_ret的高八位就是val,即child_ret = (val<<8) | 0;
使用WEXITSTATUS(child_ret)可以直接得到低八位,即val的值。
2、如果子進程意外中止,例如用了非法指針,改一下,在exit(-3)前加上:
*(int*)0 = 1234;
可以看到返回值val = 0x0B,即低八位非0。這時用WIFEXITED(status)(bool類型的)可以得到0,即異常,而為真表示正常退出;
3、可以組合使用:
if(WIFEXITED(status) != 0){
printf("normally terminate val:%d",status);
}
何為正常退出?一般調用了exit(val)或者從main()函數返回就是正常,呵呵。
這下大家明白怎么判斷了吧?