我在写这样的代码

... 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并终止应用程序。但是,free()不是signal safe function--所以我不应该调用它。但是如何释放那个变量呢?
非常感谢你的回答。。。
编辑: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.

最佳答案

我怀疑你需要。任何支持Frk()的OS,也会在进程退出时自动释放从MalCube()的分配,而不管它是如何运行的(包括终止)。
确实存在C程序不在进程中运行的环境,在那里你必须非常小心地离开退出时所处的位置。但这些环境不是POSIX,也不支持fork()。在这方面,他们可能不支持信号。如果你是为任何这样不寻常的环境写作,请检查你的文档。。。
如果您希望看到一个干净的ValgReND报告,那么您可以让处理程序将事件粘贴到子事件循环中(或者设置标志并张贴信号量或任何内容),并将事件处理为干净的退出。如果您的程序是一个交互式应用程序,并且您希望将用户的数据保存在SIGTERM上,假设您的UI框架还没有将SIGTERM转换为您的事件,那么您也会这样做。

关于c - 如何通过SIGTERM释放动态分配的变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/815439/

10-12 16:16