Я работаю на коде что-то вроде этогоКак освободить динамическую выделенную переменную от SIGTERM?
... 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 также по-прежнему показывает reacheable переменную:
==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? Это какой-то крупный доисторический грызун? :-) – JesperE
Прошу прощения, немного поздно, в Словакии, поэтому я ошибся. Спасибо за уведомление. – izidor