gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:38:46 28 4
gpt4 key购买 nike

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

有人知道为什么会这样吗? 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;
}

谢谢你和最好的问候

最佳答案

consult the manual关于 struct siginfo:

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 [...]

没有任何内容表明 info->si_pid 处于事件状态并且允许您阅读它。您的测试代码毫无意义。

继续阅读,您会发现使用 kill 发送信号 确实 填充了 si_pid 字段,这就是您看到正确 PID 的原因当您使用 kill 发送信号时。

关于c - 为什么sigaction说键盘快捷键发送的信号来自PID 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40235163/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com