c++ - 为什么写入标准输入有效?

标签 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

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

谢谢。

最佳答案

stdinstdout 通常(至少在 Linux 系统上)引用文件系统中的同一实体,单个设备文件,例如 /dev/tty2。这些"file"由特定驱动程序生成,该驱动程序会收到有关该文件的任何操作的通知。

当您从中读取内容时,驱动程序会访问(以某种方式,可能通过多个其他驱动程序)您前面的键盘,并将您键入的任何内容(通过中间的软件层过滤)返回为文件。

当您编写时,驱动程序知道它需要采取不同的操作,并通过驱动程序/显示服务器/终端仿真器的软件堆栈引导您的数据,最终将其显示给您。

因此,当您写入 stdin 时,驱动程序看到的只是您写入其设备文件,这意味着它应该显示您写入的内容。


也就是说,这肯定不是一种可移植的行为,所以不要指望这种情况会发生在不同的平台上。

关于c++ - 为什么写入标准输入有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32212183/

相关文章:

填充所有缓冲区的算法生产者-消费者

java - 防止文件竞争条件

c# - 实现 C# 接口(interface)的 C++ header

c++ - 从 C 扩展跟踪 CPython 对象的生命周期

operating-system - 什么是梯形调节器和菜单调节器?

调用系统调用read导致无限循环

c - 从文件读取时出错

c++ - 嵌套通用容器迭代 C++

c++ - 查询可用内存量

operating-system - 等待和等待与循环等待有何不同?