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

时间:2015-08-29 18:27:53

标签: c unix io-redirection

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

#include <stdio.h>

int main() {
    char *s = "hello world";
    puts(s);    
    return 0;
}

重定向:

$ gcc -Wall use_puts.c
$ ./a.out
hello world
$ ./a.out > /dev/null

但是,如果我使用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;
}

重定向:

$ gcc -Wall use_puts.c
$ ./a.out
hello world
$ ./a.out > /dev/null
hello world

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

2 个答案:

答案 0 :(得分:5)

您的write语句正在写入 stdin 而不是 stdout 。我很惊讶它的工作原理。

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

write(STDOUT_FILENO, s, strlen(s));

STDOUT_FILENO中定义了STDIN_FILENOSTDERR_FILENOunistd.h

答案 1 :(得分:3)

你写入stdin,我想你想要这个

write(1, s, strlen(s));