来自 printf 的消息如何路由到终端?

How messages from printf are routed to the terminal?

假设我在 konsole 中打开了两个选项卡(Tab1 和 Tab2)。

当我 运行 tty 在他们两个我有:

选项卡 1:

~$ tty
/dev/pts/23

选项卡 2:

~$ tty
/dev/pts/24

如果我 运行 一个简单的程序 hello.c 在 Tab1 中带有 printf("Hello"),系统如何从写入标准输出(文件 ID 1)到写入/dev/pts/23,被控制台读取然后出现在Tab1?

系统如何知道必须将 "Hello" 字符串提供给 /dev/pts/23 而不是 /dev/pts/24?它是如何做到的?

是否有 bash 给程序的参数,以便它知道向哪个伪终端发送 "Hello"?或者程序将字符串发送回 bash(如何?)谁知道将数据发送到哪个伪终端?

感谢您的帮助

如果您查看您的进程打开文件,您可以看到 STDOUT、STDERR 等指向您已经在问题中使用 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 已经解决了。