加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 20:52:35 所属栏目:安全 来源:网络整理
导读:我正在进行有关信号处理的圆顶调查. 在这种特殊情况下,我对 Linux上的SIGTSTP(SLES 11上的3.0.101)感兴趣.写了一个捕获SIGTSTP的小程序并打印其父PID和发送信号的进程的PID. 这就是我所看到的: 如果我使用kill -TSTP,则发送进程PID是我运行kill命令的shell
我正在进行有关信号处理的圆顶调查.
在这种特殊情况下,我对 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 %dn",info->si_pid,ppid);
}

int main(void)
{
    struct sigaction action;
    memset(&action,sizeof(struct sigaction));
    action.sa_sigaction = tstp_handler;
    action.sa_flags = SA_SIGINFO;
    sigaction(SIGTSTP,&action,NULL);

    printf("Registeredn");
    printf("My PID is %dn",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的原因.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读