我一直在寻找一种方法来返回信号发送者进程的pid。这是我的代码
void get_pid(int sig, siginfo_t *info, void *context)
{
printf("PID of signal sender = %d\n", info->si_pid);
}
int main(int argc, char **argv)
{
struct sigaction sa;
printf("PID: %d\n", getpid()); //display PID for kill()
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = get_pid;
sigaction(SIGUSR1, &sa, NULL);
pause(); //wait for a signal
}
该程序首先显示其PID,因此另一个程序可以使用kill()向其发送信号。然后它调用pause()
,这样程序在收到信号之前就不会结束。
如何从主功能中访问发送方的PID。
答案 0 :(得分:5)
您的代码存在问题:
您的信息是getpid()
而不是get_pid()
。 getpid是现有的库函数。
不要在信号处理程序中调用printf
。这不是信号安全的。
执行此操作的正确方法是在处理程序中设置变量并将其打印在main
static volatile int signalPid = -1;
void get_pid(int sig, siginfo_t *info, void *context)
{
signalPid = info->si_pid;
}
int main(int argc, char **argv)
{
struct sigaction sa;
printf("PID: %d\n", getpid()); //display PID for kill()
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = get_pid;
sigaction(SIGUSR1, &sa, NULL);
pause(); //wait for a signal
printf("PID of signal sender = %d\n", signalPid);
}
一旦你调用了正确的信号处理程序,就可以了。