van*_*joe 2 c linux stdin unistd.h stderr
我在野外遇到了这样的代码,我想知道为什么会这样.代码从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);
}
Run Code Online (Sandbox Code Playgroud)
好问题!这是有效的,因为当您在终端的控制台时,STDIN,STDOUT和STDERR最终都指向相同的资源:( /dev/tty或您的平台所称的任何资源).三个文件描述符是相同的文件打开3次(可能有不同的选项).
管道内容时,不再是这种情况,这个破坏的代码不再有效,因为stdin现在是一件事,而stdout/stderr则是另一件事.
在您的代码示例中,这样做没有任何意义,最好将其描述为错误.但也许那个"野外代码"的作者试图做一些与众不同的事情并且有他或她这样做的理由.您是否找到了您找到的代码示例的参考?
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |