在下面的代碼的問題,當系統功能得到執行(在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;
}
我的問題是:
- 爲什麼過程在上述情況下掛?
- 爲什麼系統不能在Solaris中發送任何信號?
...和我的最後一個問題,這是關係到我的實際應用:
其實,在我的實際應用(其中單個信號處理是有一些四個信號),其他進程發送SIGABRT信號傳遞給我的進程和信號處理程序我正在使用系統函數來終止一個進程,因此它被掛起(這與上面的場景類似)。有什麼辦法可以解決這個問題嗎?
如果你讀了['信號(7)'](http://linux.die.net/man/7/signal)手冊頁,你會看到'system'不是「保險箱」功能中在信號處理程序中調用。 – 2012-08-17 14:04:07
另外,我今天不知道Solaris,但它曾經以不同的方式處理'SIGCHLD'和'SIGCLD',也許'system'反而提出了'SIGCLD'信號呢? – 2012-08-17 14:07:15