2012-04-26 4 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

아마도 "적절하게"파괴되지는 않았지만 그보다 덜 사라진 것은 아닙니다. 바주카포를 사용하고 있으며 대상이 제대로 파괴되었는지 묻습니다. –

답변

2

유닉스 프로세스는 어떤 식 으로든 SIGKILL을 처리 할 수 ​​없습니다. 당신의 과정은 즉시 도난당한 채로 죽었습니다. 정상적인 이탈을 원한다면 SIGTERM을 살펴보십시오. 그런 다음 처리기를 등록하여 필요한 정리 작업을 수행 할 수 있습니다.

핸들러를 사용하여 프로그램을 정상적으로 종료되는 상태 (예 : 플래그를 설정 함)로 설정하여 소멸자를 실행할 수 있습니다.

3

실제로 KILL 신호는 프로세스로 전송되지 않습니다. 이것은 운영 체제가 강제로 프로그램 실행을 중단시키는 신호입니다. 즉 소멸자가 호출되지 않습니다.

예상되는 동작 볼 SIGTERM 같은 신호를 사용

kill(getpid(), SIGTERM); 
+0

신난다, 고마워! – Rainulf

0

SIGKILL은 (대부분의 경우)를 kill -9 같은이 때문에 해당 프로세스에 할당 된 메모리의 모든 운영 체제에 의해 회수됩니다.

관련 문제