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

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: morris2600
打印 上一主題 下一主題

執(zhí)行system后產(chǎn)生defunct,高手進(jìn)來分析下 [復(fù)制鏈接]

論壇徽章:
0
11 [報(bào)告]
發(fā)表于 2010-07-23 10:19 |只看該作者
如果你把上面father.c中的waitpid的注釋打開,會出現(xiàn)如下現(xiàn)象。
子進(jìn)程退出的一瞬間,父進(jìn)程在sleep還未調(diào)用waitpid,這時(shí)會出現(xiàn)一個(gè)僵尸進(jìn)程,但是馬上這個(gè)僵尸進(jìn)程就消失了。因?yàn)閣aitpid調(diào)用,子進(jìn)程的資源的到釋放了。
這時(shí)ps就只能看到一個(gè)正常的father進(jìn)程了

論壇徽章:
0
12 [報(bào)告]
發(fā)表于 2010-07-23 10:23 |只看該作者
另外你還可以讓子進(jìn)程多跑一會兒,父進(jìn)程立馬退出,就能看到子進(jìn)程的父進(jìn)程pid為1了,也就是被init進(jìn)程接管了的現(xiàn)象,這些都能一一驗(yàn)證。
或者兩次fork(),也就能看到對應(yīng)的解釋了。

論壇徽章:
0
13 [報(bào)告]
發(fā)表于 2010-07-23 10:36 |只看該作者
回復(fù) 12# duanjigang


    謝謝你詳細(xì)的例子

   可能是我沒說清楚, 或者沒有把重點(diǎn)突出出來,

   我這邊出現(xiàn)的僵尸進(jìn)程是system中調(diào)用的程序,也就是對應(yīng)你的代碼中的test_prog變成了僵尸進(jìn)程

   并且這個(gè)現(xiàn)象不是必然出現(xiàn)的。

   我的程序中并沒有先fork出子進(jìn)程然后再執(zhí)行system, 只是直接調(diào)用system, 相當(dāng)于這樣:

int  main()
{
       if (0 != system("./test_prog args"))
      {
             printf("error\n");
      }

       return 0;
}

然后偶然會發(fā)現(xiàn)test_prog變成了僵尸進(jìn)程

我對照system的源碼分析過, 其實(shí)system里做的就是先fork一子進(jìn)程, 在子進(jìn)程里調(diào)用test_prog, 同時(shí)在父進(jìn)程里調(diào)用waitpid,

所以從理論上分析system函數(shù)返回后不應(yīng)該產(chǎn)生僵尸進(jìn)程, 這才是我想問的

論壇徽章:
0
14 [報(bào)告]
發(fā)表于 2010-07-23 10:36 |只看該作者
改一改,這個(gè)也不錯(cuò)

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <sys/wait.h>
  5. int main()
  6. {
  7.         int pid = fork ();
  8.         if (pid == 0)
  9.         {
  10.                 int cc = fork();
  11.                 if (cc == 0)
  12.                 {
  13.                                 system ("./test_prog");
  14.                                 printf ("son die..\n");
  15.                                 exit (0);
  16.                 }
  17.                 else
  18.                 {
  19.                                 int i = 0;
  20.                                 for (i = 0; i < 5; i++)
  21.                                 {
  22.                                         printf ("father running %d\n", ++i);
  23.                                         sleep (1);
  24.                                 }
  25.                                 printf ("father die..\n");
  26.                                 exit(0);
  27.                 }
  28.                 }else
  29.         {
  30.                 int i = 0;
  31.                        
  32.                 int status = 0;
  33.                 while (!waitpid(pid, &status, WNOHANG))
  34.                 {
  35.                         printf ("father waiting%d\n", ++i);
  36.                         sleep (1);
  37.                 }
  38.                 //wait(NULL);
  39.                 while (1)
  40.                 {
  41.                         printf ("gradpa waiting over%d\n", ++i);
  42.                         sleep (1);
  43.                 }
  44.                 return 0;
  45.         }

  46. }

復(fù)制代碼

論壇徽章:
0
15 [報(bào)告]
發(fā)表于 2010-07-23 10:37 |只看該作者
回復(fù)  duanjigang


    謝謝你詳細(xì)的例子

   可能是我沒說清楚, 或者沒有把重點(diǎn)突出出來,

   ...
morris2600 發(fā)表于 2010-07-23 10:36



    喔,呵呵,那就看看你的system執(zhí)行的程序了,理解又偏差了{(lán):3_183:}

論壇徽章:
84
每日論壇發(fā)貼之星
日期:2015-12-29 06:20:00每日論壇發(fā)貼之星
日期:2016-01-16 06:20:00每周論壇發(fā)貼之星
日期:2016-01-17 22:22:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-20 06:20:00每日論壇發(fā)貼之星
日期:2016-01-20 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-21 06:20:00每日論壇發(fā)貼之星
日期:2016-01-21 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-23 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-31 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-01-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-14 06:20:00
16 [報(bào)告]
發(fā)表于 2010-07-23 15:50 |只看該作者
感謝關(guān)注

所謂僵尸進(jìn)程,應(yīng)該是子進(jìn)程退出了, 而父進(jìn)程并沒有處理子進(jìn)程的退出(waitpid或SIGCHLD等), ...
morris2600 發(fā)表于 2010-07-22 20:25



哦,明白你的問題了; 以前用過system() 但沒碰到過這種問題。

什么環(huán)境? 建議 google system bug 看看吧,

論壇徽章:
84
每日論壇發(fā)貼之星
日期:2015-12-29 06:20:00每日論壇發(fā)貼之星
日期:2016-01-16 06:20:00每周論壇發(fā)貼之星
日期:2016-01-17 22:22:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-20 06:20:00每日論壇發(fā)貼之星
日期:2016-01-20 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-21 06:20:00每日論壇發(fā)貼之星
日期:2016-01-21 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-23 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-31 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-01-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-14 06:20:00
17 [報(bào)告]
發(fā)表于 2010-07-23 15:53 |只看該作者
以前碰到過一個(gè)bash的bug,特定情況下bash core掉了;

system 默認(rèn)是啟動一個(gè)默認(rèn) shell 來解釋執(zhí)行命令,難道,,   純屬猜測你還是google吧

good luck

論壇徽章:
84
每日論壇發(fā)貼之星
日期:2015-12-29 06:20:00每日論壇發(fā)貼之星
日期:2016-01-16 06:20:00每周論壇發(fā)貼之星
日期:2016-01-17 22:22:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-20 06:20:00每日論壇發(fā)貼之星
日期:2016-01-20 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-21 06:20:00每日論壇發(fā)貼之星
日期:2016-01-21 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-23 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-31 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-01-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-14 06:20:00
18 [報(bào)告]
發(fā)表于 2010-07-23 16:13 |只看該作者
system 執(zhí)行的程序的直接父進(jìn)程是shell進(jìn)程,看看這個(gè)shell的類型、版本吧,,

論壇徽章:
84
每日論壇發(fā)貼之星
日期:2015-12-29 06:20:00每日論壇發(fā)貼之星
日期:2016-01-16 06:20:00每周論壇發(fā)貼之星
日期:2016-01-17 22:22:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-20 06:20:00每日論壇發(fā)貼之星
日期:2016-01-20 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-21 06:20:00每日論壇發(fā)貼之星
日期:2016-01-21 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-23 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-31 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-01-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-16 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-14 06:20:00
19 [報(bào)告]
發(fā)表于 2010-07-23 23:05 |只看該作者
程序中通過system()調(diào)用另一個(gè)可執(zhí)行程序, 如:
if (0 != system("./exe_process args")
{
     DE ...
morris2600 發(fā)表于 2010-07-22 15:53


忘了問了,你的exe_process程序本身里面有沒有fork之類的動作,這也是要考慮的一個(gè)問題,,

論壇徽章:
0
20 [報(bào)告]
發(fā)表于 2010-07-24 15:14 |只看該作者
是不是你這個(gè)父進(jìn)程了sleep 語句或 wait語句呢???
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP