문제

내가 작업한 코드 같은 것을 이

... 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 () 함수를 직접 호출하는 대신 메인에서 자식 프로세스를 시작할 수 있습니다. 명령 줄 인수를 사용하여 자식 프로그램에 메인 작업을 수행하도록 알립니다. 그러면 자식 과정이 올바르게 정리할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top