2012-08-17 83 views
1

在下面的代碼的問題,當系統功能得到執行(在Linux和使用g ++編譯),它會發送SIGCHLD信號處理(從它被稱爲),這不的Solaris代碼發生。我的意思是,如果我在Solaris中運行相同的代碼,系統函數不會向調用它的進程發送任何信號。結果,我的Linux進程掛起了。與系統功能

#include <iostream> 
using namespace std; 
#include <cstdlib> 
#include <signal.h> 

void sigHandler(int sgnNbr) 
{ 
    cout <<"Signal " << sgnNbr << "caught" << endl; 
    system("echo $HOSTNAME"); 
    exit(1); 
} 

int main() 
{ 
    signal(SIGCHLD,sigHandler); 
    system("echo $HOSTNAME"); 
    return 0; 
} 

我的問題是:

  1. 爲什麼過程在上述情況下掛?
  2. 爲什麼系統不能在Solaris中發送任何信號?

...和我的最後一個問題,這是關係到我的實際應用:

其實,在我的實際應用(其中單個信號處理是有一些四個信號),其他進程發送SIGABRT信號傳遞給我的進程和信號處理程序我正在使用系統函數來終止一個進程,因此它被掛起(這與上面的場景類似)。有什麼辦法可以解決這個問題嗎?

+3

如果你讀了['信號(7)'](http://linux.die.net/man/7/signal)手冊頁,你會看到'system'不是「保險箱」功能中在信號處理程序中調用。 – 2012-08-17 14:04:07

+0

另外,我今天不知道Solaris,但它曾經以不同的方式處理'SIGCHLD'和'SIGCLD',也許'system'反而提出了'SIGCLD'信號呢? – 2012-08-17 14:07:15

回答

2

http://pubs.opengroup.org/onlinepubs/009604499/functions/system.html

的系統()函數必須忽略SIGINT和SIGQUIT信號,並應阻斷SIGCHLD信號,同時等待命令來終止。

的Solaris是正確的; Linux不正確。

,你的程序是掛在最有可能的原因是,它是不安全的信號處理函數中調用system。有關異步信號安全功能列表,請參閱http://pubs.opengroup.org/onlinepubs/009604499/functions/xsh_chap02_04.html#tag_02_04

幹掉另一個過程中,你可以使用kill,這是異步信號安全。

+0

這裏的關鍵是,我使用系統命令來殺死其PID。所以這個過程是有什麼辦法可以殺掉進程或一些其他的方式在信號處理程序來處理系統正命令 – 2012-08-17 17:50:29

+0

u能請讓我知道我怎麼能檢查爲什麼SIGCHLD在linux下沒有被阻塞 – 2012-08-17 17:57:39

+0

@ facebook-100001358991487你應該直接使用'kill'('kill'是''中的一個函數)。關於Linux上的問題,http://lists.uclibc.org/pipermail/uclibc/2012-January/046250.html可能是相關的(你提到過Solaris,所以你可能在Sparc上)。 – ecatmur 2012-08-17 19:39:24