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;
}

しかし、デストラクタを呼び出すことはないため、作成したオブジェクトが適切に破棄されるかどうかはわかりません。

4

3 に答える 3

3

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

次のようなシグナルを使用しSIGTERMて、期待される動作を確認します。

kill(getpid(), SIGTERM);
于 2012-04-26T21:10:20.483 に答える
2

Unix プロセスはまったく処理できませんSIGKILL。あなたのプロセスは、ドアネイルのようにすぐに死んでいます。適切な終了が必要な場合は、 を調べてSIGTERMください。その後、ハンドラーを登録して、必要なクリーンアップを行うことができます。

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

于 2012-04-26T21:10:12.520 に答える
0

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

于 2012-04-26T21:12:30.663 に答える