Простая обработка сигналов в 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 или питание отключено или происходит что-то действительно плохое.

Ответы на вопрос(5)

Ваш ответ на вопрос