2011-01-27 2 views
0

내 프로그램에서 SIGINT 신호를 잡으면 어떻게 안전하게 리소스를 정리할 수 있습니까? new 연산자로 생성 된 리소스를 해제하는 방법을 모르기 때문에 신호 처리기 함수에서 delete 연산자를 호출 할 수 없습니다.SIGINT를 다루는 방법?

아이디어가 있으십니까?

+0

추가 정보 및 코드 예제 : http://stackoverflow.com/questions/4250013/is-destructor-called-if-sigint-or-sigstp-issued –

+0

'delete'를 호출하는 것이 불가능하다는 것은 무엇을 의미합니까? '? –

+1

SIGINT는 메모리 관리 작업 중에 비동기 적으로 발생할 수 있고 힙이 일치하지 않을 수 있기 때문에? 'delete'가'new '에 대한 호출을 인터럽트 한 시그널 핸들러에 의해 호출되면 어떻게 될까요? –

답변

1

응용 프로그램이 종료 된 경우 메모리에 대해 걱정할 필요가 없습니다. 당신이 어쨌든 끝내면 OS는 모든 것을 버릴 것입니다.

신호 처리기에서 정리해야 할 사항은 그렇지 않은 경우 처리보다 오래 지속되는 작업입니다. 예를 들어, 생성 한 하위 프로세스가 종료해야하는 경우에도 그렇게해야합니다.

+2

IIRC에서 OS는 파일 ID (예 : 파일 또는 소켓)가있는 항목을 정리합니다. 그러나 공유 메모리, 세마포 및 기타 IPC 구조를 정리하지는 않습니다. –

+0

그렇습니다. os가 메모리를 회수하지만 메모리를 비우고 내 로그에 로그를 저장하고 로그를 닫는 소멸자를 호출하지 않습니다. – PDF1001

1

일반적으로 프로그램의 다른 부분에 반응 할 부울 플래그를 설정하는 등 신호 처리기에서 많은 작업을 수행하지 않으려는 경우가 있습니다. 일반적으로 일부 루프가 빠져 나와 친숙한 접근 방식을 허용합니다 신호를 포함하지 않는 경우에 사용할 정돈 된 종료. 이 플래그를 사용하여 종료를 조정하는 이유는 일부 라이브러리 함수가 비동기 신호 처리 중에 안전하게 다시 입력해야하는 손상을 피할 수 있기 때문입니다. 스레드 특정 메모리를 사용하는 스레드 안전 함수조차도 비동기 재진입에 대처할 수 없습니다. 빠른 검색은 http://book.chinaunix.net/special/ebook/addisonWesley/APUE2/0201433079/ch10lev1sec6.html#ch10lev1sec6에서 안전한 기능에 대한 논의를 발견했습니다.

+0

사실 내가 Tony 설명한대로 부울 플래그를 설정하려고합니다.하지만 모든 스레드가 프로세스에서 중지 된 및 프로세스 quit.There이 코드를 확인할 수있는이 플래그를 확인하지 않습니다 내 코드에 대한 기본 항목이 있습니다. 리눅스 라이브러리 – PDF1001

+0

@ PDF1001 : 어쩌면 신호 처리를 응용 프로그램에 맡겨야 할 것입니다. 라이브러리에서 가져 오는 것이 일반적이지 않고 확장되지 않습니다 (예 : 다른 라이브러리에서도 SIGINT를 처리하고 응용 프로그램 종료를 트리거합니까?). –

관련 문제