我写了标准输入,它出现在屏幕上(0标准输入,1标准输出,2标准错误
const int SIZE=12;
int main()
{
int fd = open("input.txt", O_RDWR);
char buffer[SIZE] = "Hello world";
write(fd, buffer, SIZE - 1);
lseek(fd, 0, SEEK_SET);
char mem[SIZE];
read(fd, mem, SIZE - 1);
mem[SIZE] = '\0';
write(0, mem, SIZE - 1);
printf("\n");
write(1, mem, SIZE - 1);
printf("\n");
write(2, mem, SIZE - 1);
printf("\n");
return 0;
}
输出:
Hello world
Hello world
Hello world
这是如何运作的?标准输入没有连接到键盘吗?
感谢。
答案 0 :(得分:2)
stdin
和stdout
经常 - 至少在Linux系统上 - 指的是文件系统中的同一个实体,一个设备文件,如/dev/tty2
。这些“文件”由特定驱动程序生成,并通知该文件的任何操作。
当你从中读取时,驱动程序访问(在某种程度上,通过可能的多个其他驱动程序)你所在的键盘,并返回你键入的任何内容(由中间的软件层过滤)作为内容文件。
当你写作时,驱动程序知道它需要采取不同的操作,并通过驱动程序/显示服务器/终端仿真器的软件堆栈引导你的数据,最后显示给你。
因此,当您写入stdin
时,所有驱动程序都会看到您正在写入其设备文件,这意味着它应该显示您所写的内容。
那说这绝不是一种可移植的行为,所以不要指望这种情况会发生在不同的平台上。
答案 1 :(得分:0)
正如我所看到的,一旦你拥有了fd,你就可以随心所欲地做任何事情。 stdin,stdout和stderr是在stdio.h中声明的const指针,所以你不需要手动打开它们,但是你可以"滥用"他们写入一个并从另一个读取。
确实,有些系统将stdin直接连接到键盘,如下所述:http://www.cplusplus.com/reference/cstdio/stdin/
了解更多信息:http://pubs.opengroup.org/onlinepubs/009695399/functions/stdin.html
答案 2 :(得分:0)
UNIX计算机最初有控制台,通常通过串行电缆连接。就操作系统而言,远程屏幕和键盘是单个设备,即“控制台”,通过单个链接连接。
这种设计仍然反映在几乎所有的操作系统中。想象一下,如果这种方式有所不同,会有多疯狂。假设您运行两个Windows控制台应用程序。他们应该共享相同的键盘和屏幕连接吗?或者他们是否应该拥有自己的控制台窗口,其中包含逻辑输入流和逻辑输出流?
当您按键盘上的退格键以更正错误时,是否应该备份键盘或屏幕?它们必须是同一个设备。