为什么sigaction说键盘快捷键发送的信号来自PID 0?

我正在进行有关信号处理的圆顶调查.

在这种特殊情况下,我对
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 and si_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的原因.

点赞