僵死进程的问题

前几天被问了一个僵死进程的问题,自己更多时候并发会选择线程,对进程的问题竟然文盲到如此程度,惭愧惭愧。

 

僵死进程是说子进程退出了并没有父进程来回收它的资源,这样的进程就是僵死进程。linux是这样当一个进程由于某种原因终止后,内核并不立刻把它从系统中清除,而是把任务交给其父进程,如果父进程退出了则交给1号进程。

 

自己写了一个测试程序,系统不停开出子进程,子进程不做任何事情就退出,程序很快报出Resource temporarily unavailable的错误,因为子进程没做任何事就退出了,所以不会是因为操作系统内进程过多而导致错误,这个错误可以认为是僵死进程造成的。

测试代码:

#include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> int main() { pid_t pid = 1; for(;pid > 0;) { if((pid = fork()) <0) printf("Fork: %s/n", strerror(errno)); /* if(pid > 0){ wait(NULL); } */ } return 0; }  

 

如果把注释去掉,让父进程回收结束了的子进程资源,那么不会报错。

 

ps:在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。按系统默认将忽略此信号。如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。信号的捕捉函数中通常调用wait函数以取得进程ID和其终止状态。

 

你可能感兴趣的:(linux,测试,null,任务)