0

私はこのようなコードに取り組んでいます

... 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 を送信します。そして、var を解放してアプリケーションを終了する SIGTERM のシグナル ハンドラを作成する必要があります。ただし、free() はそうではないsignal safe functionので、呼び出すべきではありません。しかし、その変数を free() する方法は?

あなたの答えに感謝します...

編集: valgrind は、まだ到達可能な変数も示しています:

==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.
4

3 に答える 3