Безопасно ли отправлять SIGUSR1 в программу и почему? [закрыто]

Даже если я не сторонник systemd по многим причинам, медлительность не является одной из них.

Я сомневаюсь, что вы улучшите время загрузки, просто переключив систему инициализации (кроме как с sysVinit на что-то, что распараллеливает последовательность инициализации). Я предполагаю, что некоторые операции / зависание службы запускают время загрузки. Возможно, вам следует взглянуть на вывод dmesg и системный журнал, чтобы проверить, не кажется ли что-то неправильным.

Если у вас есть ключ USB 3 с отличной производительностью чтения, вы можете попробовать выскочку, загрузившись с живого дистрибутива, который использует его, как Ubuntu 12.04. Результат будет ошибочным из-за операций чтения, но в вашем случае я не думаю, что это главный фактор, замедляющий время загрузки.

0
12.11.2018, 16:37
1 ответ

Вы должны установить обработчик сигнала, используя sigaction (2)вместо signal (2 ), и установить SA_RESTARTв sa_flags, если вы не хотите это, чтобы прервать блокирующий системный вызов.

struct sigaction sa;
sa.sa_handler = your_handler;
sa.sa_flags = SA_RESTART;
sigemptyset(&sa.sa_mask);
sigaction(SIGUSR1, &sa, 0);

Или, что еще лучше, просто обработайте прерывание самостоятельно.

Если nanosleep ()и т. д. вернул -1, проверьте, если errno == EINTR, и распечатайте ход выполнения, а затем повторите вызов (sleep ()— это просто оболочка для nanosleep ()на линукс ). Вам все равно придется сделать это, если ваша программа превратится во что-то более сложное — мало что можно безопасно сделать с помощью обработчика сигналов — см. сигнал -безопасность (7 )справочная страница на Линукс.

7
28.01.2020, 02:16

Теги

Похожие вопросы