하는 방법에는 무료 동적 할당된 변수에 의해 SIGTERM?
문제
내가 작업한 코드 같은 것을 이
... HEADERS ...
int *var;
void child() {
... //some work
free(var);
exit(EXIT_SUCCESSFUL);
}
int main(void) {
...
//allocate variable
var = (int *) malloc(N*sizeof(int));
... //work with var
for(int i; i<PROC_COUNT; i++) {
pid_t child = fork();
if(pid == 0) {
child(); //main function of new proces
break;
}
elseif(pid < 0) {
//there is enormous problem -> kill every proces
kill(0, SIGTERM);
waitpid(0, NULL, 0); //wait for children
free(var);
exit(EXIT_FAILURE);
}
}
free(var);
return EXIT_SUCCESS;
}
면 프로세스가 갈래,모든 변수를 복제 너무입니다.일반 사례의 모든 복사본을 var 가 해제됩니다.
가 있으면 오류로 fork()
, 을,나를 보내는 신호 SIGTERM 모든 창조 프로세스입니다.고 쓸 필요가 신호 처리기한 SIGTERM 는 무료 var 및 종료 응용 프로그램.그러나 무료()지 signal safe function
-그래서 나지 않습니다.하지만 어떻게 무료()이 변수는?
의 많은 감사에 대한 답변을...
편집:valgrind 또한 아직도 reacheable 변:
==5928== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 1)
==5928== malloc/free: in use at exit: 20 bytes in 1 blocks.
==5928== malloc/free: 1 allocs, 0 frees, 20 bytes allocated.
==5928== For counts of detected errors, rerun with: -v
==5928== searching for pointers to 1 not-freed blocks.
==5928== checked 49,164 bytes.
해결책
나는 것을 의심해야 합니다.모든 OS 지원하는 포크(),은 또한 자동으로 할당에서 malloc()경우 프로세스가 종료에 관계없이 어떻게 그것은 그래서(해).
도 없는 환경에서는 C 프로그램을 실행하지 않는 프로세스에서,그리고 당신은 매우 주의해야 어떤 당신은 주위에 거짓말을 떠나에서 종료합니다.그러나 이러한 환경에 적지 않은 POSIX 및 지원하지 않습 fork().그들이 지원하지 않을 수 있습니다호는 문제입니다.만약 당신이 쓰기 위해 어떤 특별한 환경이 확인,문서...
당신이보고 싶은 경우 깨끗한 valgrind 보고서,당신은 수 있는 핸들러 스틱 이벤트 아이의 이벤트 루프(또는 플래그를 설정하고 포스트 세마포,또는 어떤),및 프로세스 이벤트로는 깨끗하다.그것은 또한 당신이 무엇을 할 것 이라고하는 경우 프로그램이었는 상호 작용하는 응용 프로그램이하고 당신이 저장하려면 원하는 사용자의 데이터에 SIGTERM 고 가정하면,당신의 UI 프레임워크 이미 번역 SIGTERM 이벤트로 당신입니다.
다른 팁
나는 무언가를 오해하고 있을지 모르지만 반드시 Sigterm 이후에 전체 프로세스가 사라지고 변수를 취할 것입니까?
exec를 사용하여 child () 함수를 직접 호출하는 대신 메인에서 자식 프로세스를 시작할 수 있습니다. 명령 줄 인수를 사용하여 자식 프로그램에 메인 작업을 수행하도록 알립니다. 그러면 자식 과정이 올바르게 정리할 수 있습니다.