Как сообщения от 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
уже имел дело с этим.