【问题标题】:Why sigaction says that signals sent by keyboard shortcuts come from PID 0?为什么 sigaction 说键盘快捷键发送的信号来自 PID 0?
【发布时间】:2017-03-07 05:15:39
【问题描述】:

我正在进行有关信号处理的圆顶调查。 在这种特殊情况下,我对 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 程序)

有人知道为什么会这样吗? 0 不应该是某些特殊内核进程的 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;
}

谢谢你和最好的问候

【问题讨论】:

  • OT:你不能来自信号处理程序的prinf
  • 您没有“在 shell 中键入 ctrl-z”。 Ctrl-z 由您所在的 tty/pty 的线路规则解释。所以很可能是内核将发送 TSTP。
  • @alk:我知道,但在这种情况下,处理程序的唯一目的是告诉我是谁发送了信号
  • @Art:是的,也许我应该写“在键盘上按 ctrl-z”。 stty 说 susp = ^Z 所以我假设 shell 会将信号发送到进程
  • @Patrik stty 告诉你内核如何解释它在 tty 上看到的内容,它与 shell 无关。

标签: c linux shell process signals


【解决方案1】:

关于struct siginfo,请consult the manual

si_signosi_errnosi_code 是为所有信号定义的。 (si_errno 在 Linux 上通常不用。)结构的其余部分可能 是一个联合体,因此应该只读取 对给定信号有意义 [...]

没有任何内容表明info-&gt;si_pid 处于活动状态并且您可以阅读它。你的测试代码毫无意义。

继续阅读,您会发现使用kill 发送信号确实会填写si_pid 字段,这就是为什么您在使用kill 发送信号时会看到正确的PID。

【讨论】:

  • 我读了它,它指出 si_pid 对 kill 发送的信号是活动的,这使我的代码有意义,因为它旨在捕获 kill 发送的信号。我的假设是按 ctrl-z 将执行“tty-sigtsusp”所暗示的任何事情,然后在某处调用 kill
  • @Patrik:但您没有在有问题的情况下使用kill。假设不能让你的代码工作。
  • @Patrik 你是对的,没有办法称它意义较小它是操作系统的行为,想知道它有什么问题?
  • @Kerrek SB:是的,我没有使用它。我认为 shell 会为我做这件事,因为据我所知,可以使用 kill 命令、kill() 函数或键盘快捷键发送信号,因此,当信号传递由键盘快捷键?我可以知道信号是否来自 kill
  • @Anjaneyulu:我不确定我理解你的意思
猜你喜欢
  • 2017-11-29
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多