C - Как правильно использовать SIGUSR1? - PullRequest
0 голосов
/ 21 мая 2018

Я погуглил повсюду и не нашел CLEAR-инструкций по использованию определяемого пользователем сигнала (SIGUSR1 / SIGUSR2).

Контекст: я пытаюсь отправить сигнал во время работыобработать так, чтобы после отправки сигнала обработчик сигнала напечатал инструкцию, сообщающую пользователю, что сигнал был пойман.Я попытался использовать обработчик сигнала, как показано ниже.

void signalHandler(int signalNum) {
  if (signalNum == SIGUSR1) {
    printf("Caught SIGUSR1 signal.\n");
  }
}

/* Call in main as follows */
signal(SIGUSR1, signalHandler);

Теперь, насколько я понимаю, можно поднять сигнал внутри процесса, используя функцию поднимать (), которую я пробовал (япытаюсь сделать следующее БЕЗ разветвления или использования последующих дочерних / родительских процессов).При использовании подхода, который я показал выше, программа никогда не выполняет какой-либо код внутри функции обработчика сигнала, даже если это оператор print перед оператором if.

После этого я также попытался:

signalHandler(raise(SIGUSR1));

Простите, если мои подходы запрещены, я пришел из Python.Спасибо!

РЕДАКТИРОВАТЬ: мне нужно, чтобы программа автономно сигнализировала себя, перехватывала сигнал, печатала сообщение ТОГДА перестала выполняться.Не использовать CLI.

1 Ответ

0 голосов
/ 21 мая 2018

Вы можете отправлять сигналы процессу, используя команду kill.Список всех сигналов доступен на справочной странице signal.

Вы можете определить pid вашего процесса с помощью команды ps и отправить сигнал как

kill -10 <pid>

Этот метод используется, если вы хотите отправить сигнал извне сТерминал.Если вы хотите, чтобы сам процесс отправил сигнал (или повысил сигнал), вы можете использовать raise как -

raise(SIGUSR1);

Демонстрация для того же самого - здесь.

Если вы хотите программно отправить сигнал от другого процесса, вы можете использовать kill как -

kill(pid, SIGUSR1);
...