代码之家  ›  专栏  ›  技术社区  ›  izidor

如何通过SIGTERM释放动态分配变量?

  •  0
  • izidor  · 技术社区  · 17 年前

    ... 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 --所以我不应该调用它。但是如何释放()那个变量呢?

    非常感谢你的回答。..

    EDIT: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.
    
    3 回复  |  直到 15 年前
        1
  •  4
  •   Steve Jessop    17 年前

    我怀疑你是否需要这样做。任何支持fork()的操作系统,在进程退出时,也会自动从malloc()中释放分配,无论它是如何退出的(包括终止)。

    确实存在C程序不在进程中运行的环境,在这种环境中,你必须非常小心退出时留下的东西。但是这些环境不是POSIX,也不支持fork()。就这点而言,他们可能不支持信号。如果你正在为任何这种不寻常的环境写作,请检查你的文档。..

        2
  •  0
  •   RichieHindle    17 年前

    我可能误解了什么,但SIGTERM之后,整个过程肯定会消失,带上你的变量?

        3
  •  0
  •   karunski    17 年前

    您可以使用exec从main启动子进程,而不是直接调用child()函数。使用命令行参数通知子程序在main中执行工作。然后,子进程将能够正确清理。

    推荐文章