- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我在 Bash 中运行一个程序来监听 SIGWINCH
,然后我调整运行 Bash 的终端的大小,然后程序将收到 SIGWINCH
.我想知道这个信号是如何传递给在 Bash 下运行的程序的。
这是我对发生的事情的理解,使用示例 catch_sig
我在本文末尾列出的程序:
catch_sig
作为 fork 的子进程。 catch_sig
process 继承了 Bash 的 I/O FD,也就是上面提到的 TTY。 ioctl(pty_fd, TIOCSWINSZ, &size)
,其中 pty_fd
是上述PTY的发送端。本次调用 ioctl
将更新接收 TTY 的大小并尝试发送 SIGWINCH
TTY 的进程组。 catch_sig
是上述进程组的一部分,所以 SIGWINCH
分别发送给他们两个。 SIGWINCH
使用
kill
手动添加到 Bash 的进程组然后
catch_sig
没有收到信号。例如,如果 Bash 的 PID(和进程组)是
123
我跑
catch_sig
在里面,然后我运行
kill -WINCH -123
在单独的 Pane 中,然后
catch_sig
没有收到信号。为什么会这样?
catch_sig
的源代码程序,如上所述:
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
static void sigwinch_handler(int sig) {
printf("got signal: %d\n", sig);
}
int main() {
signal(SIGWINCH, sigwinch_handler);
printf("waiting for signal...\n");
pause();
return 0;
}
最佳答案
For example, if the PID (and process group) for Bash is
123
and I runcatch_sig
in it, and then I runkill -WINCH -123
in a separate pane, thencatch_sig
doesn't receive the signal. Why is this this the case?
SIGWINCH
仅限前台(即控制)进程组。当 Bash 是
interactive ,每个作业——前台或后台——都被放置在一个单独的进程组中,前台作业临时获得终端的控制权。例如:
$ tty
/dev/pts/0
$ echo $$
123
$ ./catch_sig
waiting for signal...
2 号航站楼:
$ ps -t /dev/pts/0 -o pid,pgid,stat,comm
PID PGID STAT COMMAND
123 123 S<s bash
124 124 S<+ catch_sig
The plus sign (+
) in the STAT
field means that the process is a member of the foreground process group, see ps(1).
So, when you resize the terminal window while catch_sig
is running in the foreground (i.e. its process group was made the foreground process group by Bash, and it hasn't completed yet), SIGWINCH
is sent to catch_sig
's process group only. Then Bash reattains the control of the terminal as catch_sig
terminates.
Which can be reproduced using kill
as shown below.
Terminal #2:
$ kill -WINCH -124
1号航站楼:
got signal: 28
如需更多信息,请参阅
how job control is implemented in POSIX shells .
关于linux - `SIGWINCH` 如何通过 Bash?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63230001/
如果我在 Bash 中运行一个程序来监听 SIGWINCH ,然后我调整运行 Bash 的终端的大小,然后程序将收到 SIGWINCH .我想知道这个信号是如何传递给在 Bash 下运行的程序的。 这
我试图使用 trap "echo resized" SIGWINCH 检测我的菜单何时调整大小但它似乎没有检测到它。我目前使用的是 ubuntu 20.04,并且我正在使用 bash 脚本来执行此操作
我的gunicorn日志中不断收到以下内容: SIGWINCH ignored. Not daemonized 我正在屏幕中通过./manage.py run_gunicorn --workers=4
这很可能是另一个愚蠢的问题,但我似乎找不到答案(或任何与此相关的答案),所以这里开始吧。 我有一个在 Linux 上使用 SIGWINCH 来检测窗口大小变化的命令行程序,显然我有一个用户在 Wind
我的服务器(ubuntu 8.04)LAMP 运行 drupal 6,当流量很高时,它停止提供页面。重新启动 apache2 将不起作用,因此我必须重新启动该服务。 我在 apache2 error.
我正在 openshift 服务器(灯堆栈)中运行 Laravel。我的服务器这两天离线了。然后,我查看了错误日志,它说caught SIGWINCH,正常关闭。但是,它没有给我更多细节。如何查找停机
我是一名优秀的程序员,十分优秀!