2012-04-26 69 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,因此,所有分配给该进程的内存是由操作系统回收。