2017-12-03 10 views
0

シグナルハンドラコールバックへの入力として送信側プロセスを取得するオプションがありますか。送信側プロセスを明らかにするmacOSのシグナルハンドル

信号受信に対するコールバックを適用するメソッドのシグネチャを示します。私は

signal(signum, cbk_function); 

しかし、特定の信号にコールバックを割り当てる場合

void (*signal(int, void (*)(int)))(int); 

は、cbs_functionプロトタイプは、私が送られたプロセスのpidを取得することができる場合、私は疑問に思う、それが唯一の信号指標を取得することができますこの信号を現在のプロセスに送る。

ユーザスペースプロセスでシャットダウンイベントを検出するために必要です。

+0

私はかなり確信していますコールバック関数が整数へのポインタを取得しています。 1日の終わりに、メモリアドレスは単なるメモリアドレスです。シグナルインデックスとコールバック関数を与える他の情報を含む構造体のメモリアドレスを渡すことができます。コールバック関数では、int *をstruct myStructポインタとして扱い、データを抽出するだけです。 – yasgur99

+0

こんにちは、あなたのコメントのために、私はそのプロセスの実装へのアクセス権を持っていないと仮定し、さまざまな情報(信号ジェネレータプロセス)でいっぱいの構造体を渡す方法を知っているのか分かりません。データが一定であれば、間違いなく実行することができます... –

+0

グローバル変数? – yasgur99

答えて

1

あなたがsigaction代わりのsignal、 を使用する場合は、siginfo_t *パラメータを取るシグナルハンドラを指定することができます。 Siginfo_tは構造体で、要素はsi_pidです。標準では次のように文書化されています。

pid_t si_pid; //プロセスIDを送信します。

これを実装する方法を示すために、次のプログラムを作成しました。

#include <signal.h> 

/* Can't call standard string functions from signal hander. Write our own. */ 

int ltoa(unsigned long i, char *buf) 
{ 
    char mybuf[20] = "0"; 
    char *mbp = mybuf; 
    char *bp = buf; 

    if (i == 0) 
     *mbp++ = '0'; 
    else while (i > 0) { 
     *mbp++ = '0' + (i % 10); 
     i /= 10; 
    } 
    while (--mbp >= mybuf) 
     *bp++ = *mbp; 
    *bp = '\0'; 
    return bp - buf; 
} 


void handler(int sig, siginfo_t *si, void *uc) 
{ 
    unsigned long pid = si->si_pid; 
    char buf[20]; 
    int buflen; 

    write(1, "Received signal ", 16); 
    buflen = ltoa(sig, buf); 
    write(1, buf, buflen); 
    write(1, " from ", 6); 
    buflen = ltoa(pid, buf); 
    write(1, buf, buflen); 
    write(1, "\n", 1); 
} 

int main() 
{ 
    struct sigaction sa = { .sa_sigaction=handler, .sa_flags=SA_SIGINFO }; 
    struct sigaction oldsa; 

    sigaction(SIGINT, &sa, &oldsa); 

    pause(); 
} 

私は、Macを持っていないので、私は、Linux上でこれを実行しましたが、それは、Mac OS Xを含むほとんどのPOSIX準拠のシステム上で動作するはずです:

$ cc sig.c 
$ ./a.out 
^CReceived signal 2 from 0 
$ ./a.out& 
[1] 3454 
$ kill -2 3454 
$ Received signal 2 from 2740 
関連する問題