我正在进行有关信号处理的圆顶调查.
在这种特殊情况下,我对
Linux上的SIGTSTP(SLES 11上的3.0.101)感兴趣.写了一个捕获SIGTSTP的小程序并打印其父PID和发送信号的进程的PID.
这就是我所看到的:
如果我使用kill -TSTP,则发送进程PID是我运行kill命令的shell的PID,正如预期的那样.
如果我在shell中键入ctrl z,发送过程的PID为0,但我期望我按下ctrl z的shell的PID(我运行了catcher程序)
谁知道为什么会这样?不应该是一些特殊的内核进程的PID吗? Sigaction的文档告诉kill发送的信号将填充si_pid字段,但它没有提到shell快捷方式.也许si_pid = 0表示“未指定的发件人”.
这是我的捕手计划
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>
#include<string.h>
void tstp_handler(int num, siginfo_t* info, void* context)
{
pid_t ppid = getppid();
printf("\nReceived TSTP. pid %d ppid %d\n", info->si_pid, ppid);
}
int main(void)
{
struct sigaction action;
memset(&action, 0, sizeof(struct sigaction));
action.sa_sigaction = tstp_handler;
action.sa_flags = SA_SIGINFO;
sigaction(SIGTSTP, &action, NULL);
printf("Registered\n");
printf("My PID is %d\n", getpid());
while(1)
sleep(1);
return 0;
}
感谢你并致以真诚的问候
最佳答案 请关于struct siginfo的
consult the manual:
si_signo
,si_errno
andsi_code
are defined for all signals.
(si_errno
is generally unused on Linux.) The rest of the struct may
be a union, so that one should read only the fields that are
meaningful for the given signal […]
没有什么说信息 – > si_pid是活跃的,你可以阅读它.您的测试代码毫无意义.
继续阅读,您发现发送带有kill的信号确实填充了si_pid字段,这就是您在使用kill发送信号时看到正确PID的原因.