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

  免費注冊 查看新帖 |

Chinaunix

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

[Linux] [結(jié)貼]為什么prctl沒有如我所預期的設置一個父進程退出發(fā)給子進程信號? [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-01-18 15:55 |只看該作者 |倒序瀏覽
本帖最后由 centos_71 于 2015-01-18 19:34 編輯

我寫了一個小程序,在fork出的子進程中使用prctl,設置父進程退出后自動發(fā)送給子進程退出信號。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<unistd.h>
  4. #include<signal.h>
  5. #include<sys/prctl.h>
  6. int main()
  7. {
  8.   pid_t p = fork();
  9.   if(p==0)//father
  10.   {
  11.     printf("father\n");
  12.     getchar();
  13.     return 0;
  14.   }
  15.   else if(p<0)
  16.     exit(1);
  17.   
  18.   printf("child\n");
  19.   prctl(PR_SET_PDEATHSIG,0,0,0,0);
  20.   getchar();
  21.   return 0;
  22. }
復制代碼
我預期的是,我運行程序以后,父進程和子進程都在getchar()阻塞。
我用ps看到父子兩個進程

  1. [a@localhost ~]$ ps -ef|grep a.out
  2. a        13238  2727  0 02:41 pts/1    00:00:00 ./a.out
  3. a        13239 13238  0 02:41 pts/1    00:00:00 ./a.out
  4. a        13255 13240  0 02:42 pts/2    00:00:00 grep a.out
  5. [a@localhost ~]$ kill -9 13238
  6. [a@localhost ~]$ ps -ef|grep a.out
  7. a        13239     1  0 02:41 pts/1    00:00:00 ./a.out
  8. a        13257 13240  0 02:42 pts/2    00:00:00 grep a.out
復制代碼
然后我殺死父進程(kill -9),我期待的是,子進程可以自動退出,因為子進程已經(jīng)調(diào)用過prctl,能接收到父進程的通知對吧?
但是實際運行的結(jié)果,如上所示,子進程并沒有退出,而是成了孤兒進城了。這是為什么呢?

為什么父進程退出以后,系統(tǒng)沒有能通知子進程父進程已經(jīng)退出了,然后子進程也退出?
可能我的程序或者理解有問題,還請高人指正,多謝!

論壇徽章:
0
2 [報告]
發(fā)表于 2015-01-18 19:07 |只看該作者
回復 1# centos_71
1.首先呢,父進程,子進程你貌似沒有搞清楚 p==0 :子進程  p>0:父進程
2.prctl應該在子進程中調(diào)用,也就是說當父進程die,子進程收到prctl函數(shù)指定的信號,但是你似乎都設為了0.

根據(jù)你的代碼進行了稍微的修改:
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<unistd.h>
  4. #include<signal.h>
  5. #include<sys/prctl.h>
  6. int main()
  7. {
  8.     pid_t p = fork();
  9.     if(p==0)//child process
  10.     {
  11.         printf("child\n");
  12.         prctl(PR_SET_PDEATHSIG,SIGKILL);
  13.         getchar();
  14.         return 0;
  15.     }
  16.     else if(p<0)
  17.         exit(1);

  18.     printf("parent\n");
  19.     getchar();
  20.     return 0;
  21. }
復制代碼

論壇徽章:
0
3 [報告]
發(fā)表于 2015-01-18 19:33 |只看該作者
嗯,我果然放了兩個錯誤,pid==0是子進程,因為子進程可以getppid得到父進程id
另外就是prctl的第二個參數(shù)應該指定SIGKILL,我之前用了0,參數(shù)不對。

謝謝你的指正,現(xiàn)在的這個程序能如我所愿的工作了。
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP