Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么sigaction说键盘快捷键发送的信号来自PID 0?_C_Linux_Shell_Process_Signals - Fatal编程技术网

为什么sigaction说键盘快捷键发送的信号来自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不应该是某些特

我正在做有关信号处理的调查。 在本例中,我对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;
}
#包括
#包括
#包括
#包括
#包括
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当前位置我不太明白你的意思