亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2528 | 回復(fù): 0
打印 上一主題 下一主題

僵尸進程 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-09-27 16:13 |只看該作者 |倒序瀏覽
很老的話題了,最近用到了,所以記下來。

所謂僵尸進程,即Zombie進程。當(dāng)一個進程已經(jīng)結(jié)束,但是系統(tǒng)沒有把它的進程的數(shù)據(jù)結(jié)構(gòu)完全釋放,此時用ps 察看它的狀態(tài)是defunt。 僵尸進程占據(jù)進程表的空間,而且不能被kill掉因為它已經(jīng)死了,所以在開發(fā)多進程尤其是守護進程時注意要避免產(chǎn)生僵尸進程。

僵尸進程的產(chǎn)生原因是什么呢?
當(dāng)UNIX系統(tǒng)中1個進程結(jié)束,init即1號進程會檢查該進程有沒有子進程,如果有,init就會接管這些子進程,把這些子進程的ppid改成1。
同時init會用信號SIGCHLD通知該進程的父進程。如果父進程用wait()或者waitpid()來獲取子進程的狀態(tài)的話,那么進程的相關(guān)狀態(tài)數(shù)據(jù)返給父進程之后,該進程自身將被銷毀。
那么考慮一種情況,如果父進程沒有使用wait或waitpid呢? 此時因為子進程的狀態(tài)數(shù)據(jù)沒有被取走,所以該子進程即變成了僵尸進程。

解決方法通常有3種
1)2次fork
父進程
    pid_t pid;
    switch ( pid = fork() ) {
       case -1:           break;
       case 0:
         execl("xxx", "xxx", (char*)0,(char*)0);
         exit(-1);
       default:
         waitpid(pid, NULL, 0); //we wait to avoid zombie
         break;
子進程 xxx
    pid_t pid;
    switch ( pid = fork() ) {
       case -1:           break;
       case 0:
         /* 做子進程自己的動作 */
         sleep(1); // sleep 1 second to let the parent go firstly
         exit(-1);
       default:
         break;
     }

可以看到,子進程中又fork了一次,產(chǎn)生的孫進程做實際的操作,而子進程迅速結(jié)束返回,這樣父進程可以快速回收。而孫進程將被init進程接管。

2)捕獲SIGCHLD,然后waitpid
使用sigaction()為SIGCHLD安裝一個handler,然后在handler里使用waitpid
static void sig_handler(int signo) {
  int stat;
  while(waitpid(-1,&stat,WNOHANG)>0)
  ;
  return;
}
為什么用while是因為可能有多個子進程,而多個SIGCHLD并不會排隊。
不要用signal()函數(shù)來設(shè)handler,因為那不可靠。

當(dāng)然如果父進程可以阻塞執(zhí)行,等待子進程完成,那么不用安裝信號,直接waitpid即可。通常不會這么做。

3)設(shè)置SIGCHLD的動作為 SA_NOCLDWAIT
使用sigaction()對SIGCHLD的flag設(shè)置 SA_NOCLDWAIT,通知系統(tǒng)不產(chǎn)生僵尸。
該方法沒有試過。

本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/17004/showart_1227357.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP