代码之家  ›  专栏  ›  技术社区  ›  vanjoe

从stderr而不是stdin读取

  •  2
  • vanjoe  · 技术社区  · 7 年前

    代码从stderr(fd==2)而不是stdin(fd==0)读取。最奇怪的是,这实际上有些奏效。您可以在控制台上读取键入内容,但不能读取管道输入。知道这是怎么回事吗?

    #include <stdio.h>
    #include <unistd.h>
    int main(){
       char buf[15];
       int nchars=read(2,buf,15);
       printf("%d '%s'\n",nchars,buf);
    }
    
    1 回复  |  直到 7 年前
        1
  •  5
  •   Mahmoud Al-Qudsi    7 年前

    好问题!这是因为当您在终端的控制台上时,STDIN、STDOUT和STDERR最终都指向相同的资源: /dev/tty (或者你的平台怎么称呼它)。这三个文件描述符是同一个文件打开了3次(可能有不同的选项)。

    在您的代码示例中,这样做毫无意义,最好将其描述为一个bug。但也许《野生密码》的作者试图做一些不同的事情,他或她这样做是有原因的。你找到的代码样本有参考资料吗?