我在写这样的代码
... 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/