Я сделал программу, которая использует функцию fork()
для создания дочерних процессов. Его дочерние процессы выполняют некоторую работу, но я хочу, чтобы они завершались, когда получают сигнал SIGTERM
от родительского процесса. Перед выходом я также хочу, чтобы они очистили выделенные мной массивы и отправили кое-что через FIFO родительскому процессу. Итак, у меня есть 2 сценария.
Глобальные переменные для моих массивов, а также файловые дескрипторы для FIFO, а затем выход через функцию обработчика сигнала, например:
/*global variables*/ struct whatever ** test; int test_size; int fd_in, fd_out; /*handler*/ void shutdown(int signo) { /*free memory for the arrays malloc'd through the program*/ /*send message with the help of fd_out*/ /*close fd_in and fd_out*/ _exit(0); }
Объявите глобальный флаг int, и когда дочерние процессы обнаружат, что флаг изменился, они очищают массивы, отправляют сообщения и завершают работу.
/*global variables*/ int exit_flag=0; /*handler*/ void shutdown(int signo) { exit_flag=1; } /*child process*/ int main() { /*declare fds and arrays*/ /*use sigaction and set up handler*/ while(!exit_flag) { /*do stuff*/ } /*free memory*/ /*send message with the help of fd_out*/ /*close fds*/ }
Мой вопрос в том, какой сценарий приводит к хорошему кодированию/программированию? Они оба одинаковы или есть лучший и даже более правильный способ сделать это?