【发布时间】:2010-10-23 08:39:07
【问题描述】:
我正在编写类似这样的代码
... 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.
【问题讨论】:
-
Enourmouse?那是某种大型史前啮齿动物吗? :-)
-
对不起,在斯洛伐克有点晚了,所以我弄错了。感谢您的通知。