В моем приложении главный поток создает два объединенных потока; один, который ожидает ввода данных пользователем, вызывая в цикле scanf(), и другой, который прослушивает входящие сокетные соединения, вызывая в цикле accept(). Новые соединения обрабатываются в отдельных потоках, которые отделяются.
Я хочу, чтобы программа изящно завершала свою работу при получении сигнала SIGINT. Это означает, что прослушивающий поток должен прекратить принимать новые соединения, дождаться закрытия потоков, обслуживающих соединения в данный момент, и затем завершить работу. Поток, ожидающий пользовательского ввода, также должен завершиться и тем самым позволить завершиться главному потоку.
Scanf() и accept() оба блокируют, но могут быть прерваны сигналом, однако сигналы, посылаемые процессу, могут обрабатываться только одним потоком (AFAIK). Моя идея состоит в том, чтобы блокировать сигналы SIGINT во всех потоках, кроме главного потока, который будет их ждать. Когда он получит SIGINT, он пошлет SIGUSR1 двум потокам (одному, который блокирует scanf(), и другому, который блокирует accept()), а затем присоединится к этим потокам.
Хорошее ли это решение? Есть ли лучший или, возможно, стандартный способ добиться этого?