为什么stdout重定向适用于puts而不是write?

Wil*_*hes 1 c unix io-redirection

如果我使用puts,我可以按预期重定向stdout:

#include <stdio.h>

int main() {
    char *s = "hello world";
    puts(s);    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

重定向:

$ gcc -Wall use_puts.c
$ ./a.out
hello world
$ ./a.out > /dev/null
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用write写入stdout,shell重定向无效:

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main() {
    char *s = "hello world\n";
    write(0, s, strlen(s));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

重定向:

$ gcc -Wall use_puts.c
$ ./a.out
hello world
$ ./a.out > /dev/null
hello world
Run Code Online (Sandbox Code Playgroud)

为什么是这样?在这种情况下,如何将写入重定向到stdout?

lar*_*sks 5

你的write陈述是写给stdin而不是stdout.我很惊讶它的工作原理.

这通常是为什么你应该使用常量而不是文字值,因为它不太容易出现这种错误:

write(STDOUT_FILENO, s, strlen(s));
Run Code Online (Sandbox Code Playgroud)

(STDOUT_FILENO,STDIN_FILENOSTDERR_FILENO定义unistd.h)

  • 它的工作原理是因为没有重定向,并且他正在从一个终端运行,所以stdin,stdout和stderr都进入终端 - 终端可能是打开读/写,所以你可以写任何一个(并读取)他们中的任何一个).***不要依赖的东西; 需要修复代码才能写入stdout. (2认同)