为什么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程序) 有人知道为什么会这样吗?0不应该是某些特殊的仅内核进程的PID吗?Sigaction的文档告诉我们kill发送的信号将填充si_pid字段,但没有提到shell快捷方式。可能si_pid=0表示“未指定的发送方” 这是我的捕手程序为什么sigaction说键盘快捷键发送的信号来自PID 0?,c,linux,shell,process,signals,C,Linux,Shell,Process,Signals,我正在做有关信号处理的调查。 在本例中,我对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不应该是某些特
#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;
}
#包括
#包括
#包括
#包括
#包括
void tstp_处理程序(int num,siginfo_t*info,void*context)
{
pid_t ppid=getppid();
printf(“\n收到的TSTP.pid%d ppid%d\n”,信息->标准pid,ppid);
}
内部主(空)
{
结构动作;
memset(&action,0,sizeof(struct-sigaction));
action.sa_sigaction=tstp_处理器;
action.sa_flags=sa_SIGINFO;
sigation(SIGTSTP,&action,NULL);
printf(“已注册”);
printf(“我的PID是%d\n”,getpid());
而(1)
睡眠(1);
返回0;
}
谢谢您并致以最良好的问候请关注struct siginfo
:
si_-sign
、si_-errno
和si_-code
是为所有信号定义的。
(si_errno
通常在Linux上未使用。)结构的其余部分可能
是一个联合体,因此应该只读取
对给定信号有意义[…]
没有任何内容表明info->si_pid
处于活动状态,并且允许您阅读。你的测试代码毫无意义
继续阅读,您会发现使用
kill
发送信号会填充si_pid
字段,这就是为什么在使用kill发送信号时,您会看到正确的pid。OT:您不能从信号处理程序中选择prinf
。您不能“在shell中键入ctrl-z”。Ctrl-z由您所在的tty/pty的线路规程进行解释。所以很可能是内核发送了TSTP。@alk:我知道,但在这种情况下,处理程序的唯一目的是告诉我是谁发送了TSTPsignal@Art:是的,也许我应该写“在键盘上按ctrl-z”。stty说susp=^Z,所以我假设shell会向process@Patrikstty告诉您内核如何解释它在tty上看到的内容,它与shell无关。我读了它,它表示si_pid对于kill发送的信号是活动的,这使得我的代码很有意义,因为它被设计用来捕捉kill发送的信号。我的假设是,按ctrl-z键将执行“tty sigtussp”所暗示的任何操作,然后调用killsomewhere@Patrik:但您没有在所讨论的案例中使用kill
。假设无法使代码正常工作。@Patrik你是对的,没有办法称其为操作系统的行为,更不用说它是操作系统的行为,并想知道它有什么问题?@Kerrek SB:是的,我没有使用它。我假设shell会为我做这件事,因为据我所知,可以使用kill命令、kill()函数或键盘快捷键发送信号。那么,当键盘快捷键触发信号传递时会发生什么情况?我能知道信号是来自杀戮还是死亡not@Anjaneyulu当前位置我不太明白你的意思