Каков правильный способ очистки с помощью free()
динамических распределенных данных в C при использовании сигнала?Очистить динамически распределенные данные с сигналом
Here есть пример с общей памятью, а используемое решение - объявить глобальную переменную, но кажется не очень чистым и безопасным.
Это пример кода с массивом структуры динамически распределяемой не corretly очищено
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
typedef struct {
int val;
} mystruct_t;
void sigquit(int sig) {
signal(sig, SIG_IGN);
printf("Child killed\n");
// Clear the dynamic allocated data inside
// the signal quit method
//
// int i;
// for (i = 0; i < n; i++) {
// free(struct_a[i]);
// }
// free(struct_a);
exit(0);
}
int
main()
{
int n = 10;
/* dynamic allocated array of structure */
mystruct_t **struct_a = generatearray(n);
pid_t pid = fork();
if (pid == 0) {
printf("Child process. My pid is %d and my parent's id is %d.\n",
getpid(), getppid());
if (signal(SIGQUIT, sigquit) == SIG_ERR) {
printf("SIGINT install error\n");
exit(1);
}
while(1);
}
else {
printf("Parent process. My pid is %d and my parent's id is %d.\n",
getpid(), pid);
sleep(1);
kill(pid, SIGQUIT);
sleep(5);
}
return 0;
}
Какой метод вы будете использовать, чтобы решить эту проблему?
В реальном коде, вероятно, дочерний процесс будет иметь цикл событий, используя 'select' или какой-либо другой аналогичный механизм. Тогда общая процедура для обработчика сигнала просто устанавливает флаг. Затем цикл события обнаружит это и очистит процесс и выйдет в эту точку (вне обработчика сигнала). – kaylum