主要是部分程序使用了大量的assert,如果用线程的话,貌似会把整个进程挂掉,因此只能父子来了。
由于通信的信息不多,所以用管道读写应该就够了。
#include <stdio.h>
int main()
{
int fd[2];
int pid;
char buf[1024];
if( -1 == pipe(fd) )
{
printf("pipe() fail.");
ret[......]
主要是部分程序使用了大量的assert,如果用线程的话,貌似会把整个进程挂掉,因此只能父子来了。
由于通信的信息不多,所以用管道读写应该就够了。
#include <stdio.h>
int main()
{
int fd[2];
int pid;
char buf[1024];
if( -1 == pipe(fd) )
{
printf("pipe() fail.");
ret[......]
fork()之后,子进程和父进程分叉执行,僵尸进程的产生是因为父进程没有给子进程“收尸”造成的,又可以根据危害程度分为下述两类:
总体来说:当子进程结束之后,但父进程未结束之前,子进程将成为僵尸进程。
(1)当子进程结束之后,但父进程未结束之前,子进程将成为僵尸进程,父进程结束后僵尸被init进程回收。
(2)如果子进程结束了,但是父进程始终没有结束,那么这个僵尸将一直存在,而且随着exec,僵尸越来越多。
传统的方法是在parent中使用wait()等待子进程直到回收,但是这样就会一直阻塞,父进程什么都作不了了!
有没有别的方法呢?有!那就是使用waitpid()+Signal的方法实现异步干掉僵尸进程。
原理:
(1)子进程退出的时候,会发送一个信号:SIGCHLD
(2)使用signal()可以指定程序处理某个信号量的对应handle函数
内附源代码。[......]