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

} 

handle_sigintで誰か(pid /プロセス名)がシグナルを送信したいと思います。
perlでその情報をキャプチャする方法はありますか?シグナルの送信元のIDを取得する

私はCでこれを行うことができ、これはモジュールとしてのpythonに移植されて、私は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

私はそれをキャプチャするc拡張モジュールを書いたので、pythonでこの情報を取得することができますが、perlに移植できる場合はidk – ealeon

+2

OKです。まあ、最悪の場合、Cをperlにインライン展開することができます。正直なところ、シグナルハンドラがその情報を渡したとは思っていませんでした。 – Sobrique

答えて

1

単なる整数です。また、信号は、他のプロセスだけでなく、あらゆる種類のイベントから来ることがあります。例えば、man 7 signalによって与えられるリストは、あらゆる種類の可能なソースを明らかにする。

シグナルに含まれていないすべて。


質問編集

へのアップデート追加のCコードは正確に信号自体を使用していますが、全体の多くを照会しません。 Perlにおける同様のアプローチは、Syckによって発掘されたthis postで解説されています。

siginfo_tから情報を収集すると、POSIX::SigActionはこれらのフィールドを公開することを意図していますが、明らかにそうではありません。あなた自身の内線番号を書いたほうがよいかもしれません。sobrique

1

SA_SIGINFOとsignalfdを組み合わせて、信号を送信したプロセスのPIDを調べることができます。

参照:How can I tell in Linux which process sent my process a signal

それはカーネル空間のことだが、私は、私はそのための参照を見つけることができるかわからないので答えは、「いいえ」である
関連する問題