У меня есть программа, которая создает много потоков и запускается до тех пор, пока не отключится питание на встроенном компьютере, или пользователь не использует kill
или ctrl c для завершения процесса.
Вот какой код и как выглядит 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 catching kill для изящного завершения" , что, по-видимому, ОС будет обрабатывать очистку для меня. Поэтому могу ли я просто заменить обработчик сигнала только бесконечным циклом и позволить ОС изящно выйти из потоков, де-выделить память и т.д.? -
Есть ли какие-либо другие сигналы, которые мне нужно беспокоиться относительно чистого завершения? Этот поток "Как SIGINT относится к другим сигналам терминалов?" , было полезно перечислить все сигналы, которые могут быть затронуты, но сколько фактически требуется для обработки?
-
Является ли переменная terminate в моем примере неустойчивой? Я видел много примеров, когда эта переменная является изменчивой, а другие - там, где это не так.
-
Я читал, что
signal()
теперь устарел, и использоватьsigaction()
. Есть ли действительно хорошие примеры, чтобы показать, как конвертировать из предыдущего вызоваsignal()
? У меня возникли проблемы с новой структурой, которую я должен создать/передать и как все это сочетается. -
Требуется ли второй вызов
signal()
?
Есть ли что-то подобное, что мне нужно беспокоиться дляsigaction()
?
Чтобы быть ясным, все, что я пытаюсь выполнить, чтобы мой основной цикл выполнялся до тех пор, пока не будет ctrl c или отключено питание или что-то действительно плохое.