Если я запустил программу в Bash, которая прослушивает SIGWINCH
, и я изменю размер терминала, на котором работает Bash, тогда программа получит SIGWINCH
. Я хотел бы знать, как этот сигнал передается в программу, работающую под Bash.
Вот мое понимание того, что происходит, используя образец catch_sig
программы, который я перечисляю в конце этого сообщения:
- Эмулятор терминала будет работать Bash за принимающей стороной PTY. Таким образом, «STDIN» и «STDOUT» для Bash будут TTY.
- Bash запускает
catch_sig
как подпроцесс путем разветвления. Процесс catch_sig
наследует FD Bash для ввода-вывода, которые являются упомянутыми выше TTY. - При изменении размера эмулятора терминала он должен вызвать
ioctl(pty_fd, TIOCSWINSZ, &size)
, где pty_fd
- отправляющий конец указанного выше PTY. Этот вызов ioctl
обновит размер принимающего TTY и попытается отправить SIGWINCH
группу процессов для TTY. - Bash и
catch_sig
являются частью указанной выше группы процессов, поэтому SIGWINCH
отправляется им обоим по отдельности.
Однако одна проблема, с которой я столкнулся с вышеуказанным, заключается в том, что если я попытаюсь отправить SIGWINCH
в группу процессов для Bash вручную с помощью kill
, тогда catch_sig
не получит сигнал. Например, если PID (и группа процессов) для Bash равен 123
, и я запускаю в нем catch_sig
, а затем запускаю kill -WINCH -123
в отдельной панели, то 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;
}