为什么写入标准输入有效?

时间:2015-08-25 19:13:07

标签: c++ operating-system file-descriptor system-calls redirectstandardoutput

我写了标准输入,它出现在屏幕上(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

这是如何运作的?标准输入没有连接到键盘吗?

感谢。

3 个答案:

答案 0 :(得分:2)

stdinstdout经常 - 至少在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控制台应用程序。他们应该共享相同的键盘和屏幕连接吗?或者他们是否应该拥有自己的控制台窗口,其中包含逻辑输入流和逻辑输出流?

当您按键盘上的退格键以更正错误时,是否应该备份键盘或屏幕?它们必须是同一个设备。