湛江免费网站制作,外链建设原则,品牌网站建设小蝌蚪2a,动态域名可以做网站吗在2号手册里查wait#xff08;#xff09;。wait()等待任意一个子进程的状态。
wait#xff08;#xff09;等待成功会返回该子进程的id,返回失败会返回-1#xff1a; 小实验 子进程的退出码
子进程执行work()#xff0c;父进程wait子进程。
子进程跑完5秒之后就e… 在2号手册里查wait。wait()等待任意一个子进程的状态。
wait等待成功会返回该子进程的id,返回失败会返回-1 小实验 子进程的退出码
子进程执行work()父进程wait子进程。
子进程跑完5秒之后就exit0退出。
子进程跑的时候是run状态
当子进程跑完父进程接收到子进程的状态即僵尸状态然后父进程会跑10秒10秒过后父进程也结束进程。
代码如下
#includesys/types.h
#includesys/wait.h
#includeunistd.h
#includestdlib.h
#includestdio.hvoid work()
{int cnt5; while(cnt--) { printf(子进程开始启动pid:%d,ppid:%d,cnt:%d\n,getpid(),getppid(),cnt); sleep(1); }
} int main()
{ sleep(10); pid_t idfork(); if(id0) //子进程{ work(); exit(0); } else //父进程{pid_t retwait(NULL); if(retid) {printf(wait success,pid:%d\n,getpid());}
}sleep(10);return 0;}
~结论子进程在跑父进程就要进行阻塞等待。等子进程跑完父进程才wait sucess,总结如下 waitpid() 用法 三个参数重点讲一下 stauts status是输出型参数所谓输出型参数需要用户自己定义变量然后传参操作系统接收这个参数经过操作之后再返回给用户级变量
如下定义一个int型变量变量名为status取地址传参然后等如果父进程等待子进程之后就把status的值打印出来看看 结果如下 status是一个整形有32位分为高八位和低八位 如果进程正常退出就返回低八位的0高八位的退出状态。
如果异常退出就返回低七位的终止信号为什么不是低八位呢 低八位的第一位是core dump标志所以只返回低七位。
如下我们把子进程的退出码改为exit10再让父进程去等待运行结果status为2560。 因为退出码10的二进制为1010又因为异常所以在高八位如下
转化为十进制就是2560 exit sign为stautus的信号退出码exit code为status的进程退出码
printf(wait success,pid:%d,status返回码%d, exit sign:%d ,exit code:%d\n,getpid(),ret,status0x7F,(status8)0xFF);
为什么exit sign是 status0x7F
因为信号退出码在低七位 7是3个1F是4个1合起来就是7个17个1就把低七位保留其他位全变0
同理exit code为高八位
运行结果
退出信号为0退出码为10、 如果我们把子进程的退出码改为正常退出码即0再跑就会退出信号为0退出码为0 我们给子进程写一个除0错误 退出信号会显示8 我们让子进程出现空指针错误 退出信号为1111就是段错误 第二个实验 手动退出
我们让子进程不要退出了一直运行
此时运行之后子进程就会一直跑然后我们输入kill -9 pid终止进程进程退出信号会显示9 小结
父进程得到子进程的退出结果实际上是调用stautus这个整型变量可以用一个指针解引用即可得到status。 WIFEXITED WEXITSTAUS 用这两个宏就我们就可以不用关注返回值宏会自己获取子进程的返回值。
调用WIFEXITED获取是否正常退出如果为假直接输出else里面的异常。
如果为真就调用WEXITSTAUS获取子进程的退出码并打印出来。 我们可以先搞一个异常出来把子进程死循环
运行 我们再把子进程改为正常的再运行: 非阻塞轮巡/非阻塞等待
与阻塞式等待相对。
阻塞式等待父进程什么事情也不干就在那等着子进程返回值。
阻塞式等待可以干自己的事情等子进程返回的时候接收一下就可以了。