2012-04-26 72 views
2

在下面,子進程創建對象。它使用信號一定時間後自行終止:對象是否會被殺死?

#include <unistd.h> 
#include <signal.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <stdlib.h> 
#include <iostream> 
using namespace std; 

class Wut{ 
public: 
    Wut(){cout<<"obj being created" << endl;} 
    ~Wut(){cout<<"obj being destroyeed" << endl;} 
}; 

void alarmHandler(){ 
    cout << "Alarm! Forcing child to kill itself" << endl; 
    kill(getpid(), SIGKILL); 
} 

int main(int argc, char* argv[]){ 
    int status; 
    pid_t pid; 
    if((pid = fork()) == 0){ 
     Wut hi; 
     signal(SIGALRM, (sighandler_t)alarmHandler); 
     alarm(1); 
     alarm(7); 
     sleep(10); 
     cout << "this will not get printed" << endl; 
    } else { 
     wait(&status); 
     cout << "Parent dies" << endl; 
    } 
    sleep(10); 
    return 0; 
} 

但我不知道這是否創建該對象被銷燬正確,因爲它永遠不會調用析構函數。

+1

也許不是「妥善」銷燬,但他們都走了。您正在使用火箭筒,並詢問目標是否被正確銷燬。 – 2012-04-26 21:10:26

回答

2

Unix進程無法以任何方式處理SIGKILL。你的過程立刻就像門衛一樣死了。如果你想要一個優雅的退出,看看SIGTERM。然後您可以註冊一個處理程序來執行所需的清理。

您可以使用處理程序將程序置於正常退出的狀態(例如通過設置標誌等),允許析構函數運行。

3

KILL信號實際上並未發送給進程;這是操作系統強制停止程序執行的信號。這意味着析構函數不會被調用。

使用像SIGTERM一個信號,看到預期的行爲:

kill(getpid(), SIGTERM); 
+0

真棒,謝謝! – Rainulf 2012-04-26 21:37:53

0

SIGKILL是(在大多數情況下)一樣kill -9,因此,所有分配給該進程的內存是由操作系統回收。

相關問題