あなたが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
私はかなり確信していますコールバック関数が整数へのポインタを取得しています。 1日の終わりに、メモリアドレスは単なるメモリアドレスです。シグナルインデックスとコールバック関数を与える他の情報を含む構造体のメモリアドレスを渡すことができます。コールバック関数では、int *をstruct myStructポインタとして扱い、データを抽出するだけです。 – yasgur99
こんにちは、あなたのコメントのために、私はそのプロセスの実装へのアクセス権を持っていないと仮定し、さまざまな情報(信号ジェネレータプロセス)でいっぱいの構造体を渡す方法を知っているのか分かりません。データが一定であれば、間違いなく実行することができます... –
グローバル変数? – yasgur99