Простая обработка сигналов в Linux
У меня есть программа, которая создает много потоков и работает до тех пор, пока либо питание не будет отключено от встроенного компьютера, либо пользователь не используетkill
или жеCtrlC прекратить процесс.
Вот'немного кода и как выглядит main ().
static int terminate = 0; // does this need to be volatile?
static void sighandler(int signum) { terminate = 1; }
int main() {
signal(SIGINT, sighandler);
// ...
// create objects, spawn threads + allocate dynamic memory
// ...
while (!terminate) sleep(2);
// ...
// clean up memory, close threads, etc.
// ...
signal(SIGINT, SIG_DFL); // is this necessary?
}
Мне интересно несколько вещей:
Нужна ли обработка сигналов?
Читаю в этой темеLinux C ловит сигнал об убийстве для корректного завершения ", что, видимо, ОС будет обрабатывать очистку для меня. Следовательно, могу ли я просто заменить обработчик сигнала просто бесконечным циклом и позволить ОС корректно выходить из потоков, освобождать память и т. Д.?
Есть ли какие-либо другие сигналы, которые мне нужно беспокоить относительно чистого завершения? Эта нитьКак SIGINT относится к другим сигналам завершения? ", было бы полезно перечислить все сигналы, которые могут меня интересовать, но сколько на самом деле требуется обработки?
Должна ли переменная завершения в моем примере быть изменчивой? Я'Мы видели много примеров, когда эта переменная изменчива, а другие - нет. Я '
прочитал этоsignal()
сейчас устарела, и использоватьsigaction()
, Есть ли действительно хорошие примеры, чтобы показать, как конвертировать из предыдущегоsignal()
вызов? Я'У меня возникли проблемы с новой структурой, которую я должен создать / передать, и как все это сочетается.
Является ли второй звонокsignal()
необходимо?
Есть ли что-то подобное, что мне нужно беспокоиться о?sigaction()
Чтобы быть понятным, все, что яя пытаюсь выполнить мой основной цикл до тех пор, покаCtrlC или питание отключено или происходит что-то действительно плохое.