2010-02-08 294 views
1

如果我有父協調員程序和工作程序,但協調員程序正在創建所有需要的工作進程。如果我想正確實施alarm()方法來殺死所有進程並在一段時間後終止程序。如何正確實施alarm()方法來終止由fork()創建的所有工作進程?

這是實施它的正確方法嗎?目前我擁有它的方式,它現在會打印出相應printf()消息的消息,以供正在被殺死的工作進程使用。

注意:我實現了忽略中斷信號,以便更多的工作進程無需擔心。

int main(int argc, char** argv) 
{ 
signal(SIGINT, sig_ctrl); 
signal(SIGALRM, sig_alarm); 

alarm(5); 
sleep(10); 

    //rest of program which creates the needed processes 

} 

void sig_ctrl(int sig) 
{ 
printf("Hold on buddy, you're not terminating this program with CTRL^C.\n"); 
} 

void sig_alarm(int sig) 
{ 
sleep(0); 
fflush(stdout); 
printf("The alarm is sounding, all worker procceses will be...TERMINATED!"); 
raise(SIGTERM); 
} 

回答

2

有一個簡單的方法,這可以說是馬虎的方式,和艱難的方式。

簡單的方法是確保初始過程是過程組領導,忽略適當的信號(但其孩子不會忽略信號),然後將信號發送給過程組。

更困難的方法是需要在所有子進程的某處列出一個列表,然後父進程可以適時地向每個進程發送一個信號,從列表中刪除死信號。

0

我在unix設備的某些作業中遇到了同樣類型的問題。這是相當多的解決方案大多數人想出了:P

1

你的程序的問題是睡眠()通常使用SIGALRM定時器實現的,所以稱它可能會覆蓋您的設置SIGALRM

$信號()男子3睡眠

 
BUGS 
     sleep() may be implemented using SIGALRM; mixing calls to alarm(2) and 
     sleep() is a bad idea. 

(順便說一句,該sleep(0)是無稽之談了。你到底想達到與?)