Как сообщения от printf направляются в терминал?

Допустим, я открыл две вкладки в консоли (Tab1 и Tab2).

Когда я запускаю tty в обоих из них, у меня есть:

Tab1:

~$ tty
/dev/pts/23

Таб2:

~$ tty
/dev/pts/24

Если я запускаю простую программу hello.c с printf("Hello") в Tab1, то как система переходит от записи в стандартный вывод (идентификатор файла 1) к записи в /dev/pts/23, читаемой консолью и затем появляется в Tab1?

Как система знает, что она должна передать строку "Hello" в /dev/pts/23, а не в /dev/pts/24? И как это сделать?

Есть ли параметр, заданный программой bash, чтобы он знал, какой псевдотерминал отправит "Hello"? Или программа отправляет строку обратно в bash (как?), Кто знает, на какой псевдотерминал отправлять данные?

Спасибо за помощь

1 ответ

Решение

Если вы посмотрите на файлы, открытые вашим процессом, вы увидите, что STDOUT,STDERR и т. Д. Указывают на конкретный терминал psuedo, который вы уже определили, используя tty в вашем вопросе

root@hello:~# ls -l /proc/self/fd
total 0
lrwx------ 1 root root 64 May 21 02:18 0 -> /dev/pts/3
lrwx------ 1 root root 64 May 21 02:18 1 -> /dev/pts/3
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3

Как вы, возможно, знаете, процесс создается fork системный вызов, который фактически дублирует дескрипторы открытого файла от родителя. в общем, ваш процесс получает файловые дескрипторы от своего родителя.

Как родитель с этим связался? Что ж, konsole уже имел дело с этим.

Другие вопросы по тегам