LINUX.ORG.RU
ФорумAdmin

Терминал /dev/pts для нескольких программ

 , , , ,


0

1

Добрый день!

Возможно я туплю, но не нашел решения. Итак, есть терминал /dev/pts/0 в котором запущен bash:

[rav@nixos:~]$ sudo lsof /dev/pts/0
      Output information may be incomplete.
COMMAND     PID USER  FD   TYPE DEVICE SIZE/OFF NODE NAME
.konsole-  4572  rav  19u   CHR  136,0      0t0    3 /dev/pts/0
bash       4582  rav   0u   CHR  136,0      0t0    3 /dev/pts/0
...
top       22527  rav   0u   CHR  136,0      0t0    3 /dev/pts/0
...

в дереве процессов pstree все выгдялит логично:

 | | |-+- 04572 rav /etc/profiles/per-user/rav/bin/konsole 
 | | | |-+= 04582 rav /run/current-system/sw/bin/bash 
 | | | | \--= 22527 rav top 

в это время в терминал /dev/pts/0 приходит программа pinentry и предлагает свое диалоговое окно пользователю:

[nix-shell:~]$ sudo lsof /dev/pts/0
      Output information may be incomplete.
COMMAND     PID USER  FD   TYPE DEVICE SIZE/OFF NODE NAME
.konsole-  4572  rav  19u   CHR  136,0      0t0    3 /dev/pts/0
...
bash       4582  rav 255u   CHR  136,0      0t0    3 /dev/pts/0
...
top       22527  rav   3u   CHR  136,0      0t0    3 /dev/pts/0
.pinentry 22992  rav  10r   CHR  136,0      0t0    3 /dev/pts/0
...

но она не является потомком запущеного там bash:

 | |-+= 01874 rav /nix/store/h7qn6nl04qplrsnqlgwxp72rsg4cil9r-gnupg-2.4.5/bin/gpg-agent --supervised 
 | | |--- 22992 rav pinentry 
 | | \--- 22843 rav scdaemon --multi-server

отсюда наблюдается интересная картина, когда устройством терминала /dev/pts/0 пытаются пользоваться 2 ничего не знающие друг о друге программы. И часть вводимых с клавиатуры символов рандомно попадают то в одну, то в другую. Вопрос, как сделать так, что бы весь ввод попадал в pinentry


SIGSTOP остальным пока pinentry работает, потом SIGCONT. Запретить им делать read() из пайпа нельзя.

Вообще, я замечал что ядро иногда само рассылает SIGSTOP то ли какой-то его аналог прогам, пытающимся читать из терминала одновременно с кем-то ещё, но точный алгоритм не интересовался.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Вот спасибо, работает. Теперь надо понять как не прибить то что надо и как это отличить. В kde это konsole, в gnome что то другое, при ssh скорее всего третье. Да и как gpg-agent заставить это делать перед запуском pinentry.

torm7
() автор топика
Ответ на: комментарий от torm7

Хм, вообще /dev/pts/N это клиентская сторона виртуального терминала, в эмуляторе терминала он не должен быть открыт. И у тебя там не konsole а какое-то .konsole- (видимо не влезло название). Посмотри что это такое вообще. В xfce4-terminal и в xterm такого точно нет, у остальных не проверял.

firkax ★★★★★
()