2012-04-26 6 views
2

以下では、子プロセスがオブジェクトを作成します。これは、一定期間後に自分自身を殺すために信号を使用しています。オブジェクトはkillで適切に破壊されますか?

#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

おそらく「適切に」破壊されていないかもしれませんが、それほど少なくはありません。あなたはバズーカを使用していて、ターゲットが適切に破壊されているかどうか尋ねます。 –

答えて

2

UNIXプロセスでは、いかなる方法でもSIGKILLを処理できません。あなたのプロセスは、即座にドアノルとして死んでいます。優雅な出口を希望する場合はSIGTERMをご覧ください。次に、必要なクリーンアップを実行するためにハンドラを登録できます。

ハンドラを使用して、プログラムを正常に終了する状態にすることができます(たとえば、フラグを設定するなど)。デストラクタを実行できるようにします。

3

実際にKILL信号はプロセスに送信されません。これは、オペレーティングシステムが強制的にプログラムの実行を停止させるための信号です。つまり、デストラクタは呼び出されません。

予想される動作を参照するSIGTERMような信号を使用する:

kill(getpid(), SIGTERM); 
+0

恐ろしく、ありがとう! – Rainulf

0

SIGKILLをので、すべてそのプロセスに割り当てられるメモリは、オペレーティング・システムによって再生され、(ほとんどの場合)kill -9と同じです。

関連する問題