Це ^ C обробка здійснюється драйвером термінального пристрою, а не оболонкою.
Саме тоді, коли цей символ отримується на дроті, який підключається до пристрою tty (або записується на головній стороні основного боку псевдотермінальної пари (як xterm
це робиться при натисканні Ctrl+C)), то дисципліна в рядку tty (драйвер у ядро) посилає сигнал SIGINT до групи переднього плану терміналу.
Тому вам потрібно буде надіслати цього символу на fd, який xterm відкрив на стороні master.
$ eval "$(xprop -notype -id $WINDOWID 32i '=$0\n' _NET_WM_PID)"; lsof -ap "$_NET_WM_PID" /dev/ptmx
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xterm 21123 stephane 4u CHR 5,2 0t0 1460 /dev/ptmx
Написати його /proc/21123/fd/4
на Linux не вийшло, оскільки це було б просто відкрито, /dev/ptmx
тому не посилайтеся на той самий псевдотермінал. Вам потрібно буде переконати в тому , xterm
щоб написати це ^ C до його fd 4.
Тож насправді не варіант.
Ви можете запустити свою власну псевдотермінальну пару і запустити в ній sh і ping. Тоді ви можете написати ^ C на головній стороні для того, щоб SIGINT був надісланий групі процесу переднього плану, але простіше тут було б направити сигнал безпосередньо (перевагу буде SIGTERM).
Також зауважте, що намагатися написати персонаж /proc/$pid/fd/0
не має сенсу. Дескриптор файлу зазвичай відкритий для читання. В Linux, відкриття () на цьому /proc/$pid/fd/0
фактично відновлює ресурс, на який вказує цей fd.
Так, наприклад , якщо sh
був запущений з sh < /some/file
, роблячи echo something > "/proc/$shpid/fd/0"
б замінити вміст /some/file
з something\n
. Якби це було tty, то це просто відображатиметься something
на цьому терміналі. Єдиний випадок, коли пишуть something
, що щось читається - sh
це, коли б це було, - це труба. Якщо в Linux (і тільки в Linux), якщо ви працюєте open()
в режимі запису до /proc/$shpid/fd/0
(де це труба), то це відкриває кінець запису цієї труби (хоча цей fd 0 фактично вказує на кінець читання).