2016-09-27 3 views
3
local $SIG{INT} = \&handle_sigint; 
sub handle_sigint { 
    print "received sigint\n"; 

} 

in handle_sigint Я хотел бы распечатать, кто (имя файла/процесса) отправил сигнал.
Есть ли способ захватить эту информацию в perl?Захват pid сигнала отправителя

я могу сделать это в C, и это переносится на питон как модуль
Ищу эквивалент в Perl

static void csignal_handler(int signum, siginfo_t *siginfo, void *context) { 

    char *interrupt_msg[150]; 
    if (siginfo->si_pid != 0) { 
     struct passwd *pwd = getpwuid(siginfo->si_uid); 
     if (pwd != 0) { 
      sprintf(interrupt_msg, "Received signal '%d' from process '%d' (%s) of user '%s'\n", 
       signum, siginfo->si_pid, get_process_name_by_pid(siginfo->si_pid), pwd->pw_name); 

     } else { 
      sprintf(interrupt_msg, "Received signal '%d' from process '%d' (%s) of user '%d'\n", 
       signum, siginfo->si_pid, get_process_name_by_pid(siginfo->si_pid), siginfo->si_uid); 

     } 

     printf("%s", interrupt_msg); 
    } 
    if (raise_interrupt) { 
     PyGILState_STATE gstate = PyGILState_Ensure(); 
     PyErr_SetString(PyExc_KeyboardInterrupt, interrupt_msg); 
     PyGILState_Release(gstate); 
    } else { 
     interrupted = 1; 
    } 
} 
+0

Уверен, что ответ «нет», потому что это пространство ядра вещь, но я не уверен, что я мог бы найти ссылку для этого. – Sobrique

+0

им удалось захватить эту информацию в python, потому что я написал модуль расширения c, который захватывает его, но idk, если он может быть портом для perl – ealeon

+2

OK. Ну, в худшем случае вы можете встроить C в perl. Я честно не думал, что обработчик сигнала передал эту информацию. – Sobrique

ответ

1

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

Все, что отсутствует в сигнале.


Обновление к вопросу редактирования

Добавленный код C точно не использовать сам сигнал, но запрашивает многое другое. Аналогичный подход в Perl обсуждается в this post, найденный в Syck в комментарии.

Что касается выкапывания этой информации от siginfo_t, то для отображения этих полей предназначено POSIX::SigAction, но, по-видимому, это не так. Возможно, вам лучше написать собственное расширение или попробовать с Inline::C, как предложено sobrique

Смежные вопросы