Может ли процесс Linux блокировать внешние сигналы, но принимать сигналы от своего собственного процесса? - PullRequest
1 голос
/ 30 января 2012

Я пытаюсь настроить процесс Linux, который блокирует SIGTERM, который отправляется командой kill (или любым другим процессом), но позволяет отправлять SIGTERM изнутри себя (через системный вызов kill(2)). ).

Возможно ли это?

Вот пример программы, которую я написал, но она SIG_BLOCKS как для внешних, так и для внутренних сигналов, поэтому она не выполняет то, что я хочу:

#include <signal.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv)
{
  sigset_t sigs;

  sigemptyset(&sigs);
  sigaddset(&sigs, SIGTERM);
  sigprocmask(SIG_BLOCK, &sigs, 0);

  printf("Sleeping 30 secs, try killing me! (pid: %d)\n", getpid());
  sleep(30);
  printf("About to call kill\n");
  kill(getpid(), SIGTERM);
  printf("This never happens!\n");

  return 1;
}

Вывод:

Sleeping 30 secs, try killing me! (pid: 29416)
About to call kill
This never happens!

Но это должно быть:

Sleeping 30 secs, try killing me! (pid: 29416)
About to call kill

Потому что процесс должен быть убит изнутри через kill(getpid(), SIGTERM).

Ответы [ 2 ]

3 голосов
/ 30 января 2012

Не уверен, что это то, что вам нужно, но вы можете настроить обработчик сигнала, используя sigaction с флагом SA_SIGINFO, чтобы ваш обработчик SIGTERM вызывал только _exit, если siginfo.si_pid вашPID

0 голосов
/ 08 января 2013

Согласно тому, что я проверяю, если вы не блокируете сигнал. Вы можете увидеть ожидаемое поведение.

Но если вы заблокировали сигнал, kill вернется со значением 0, и, поскольку программа продолжит выполнение, она напечатает строку и завершит работу. Я использую Ubuntu 12.04LTS для тестирования.

...