【发布时间】: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