如果我使用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?
答案 0 :(得分:5)
您的write
语句正在写入 stdin 而不是 stdout 。我很惊讶它的工作原理。
这通常是你应该使用常量而不是文字值的原因,因为它不太容易出现这种错误:
write(STDOUT_FILENO, s, strlen(s));
(STDOUT_FILENO
中定义了STDIN_FILENO
,STDERR_FILENO
和unistd.h
答案 1 :(得分:3)
你写入stdin,我想你想要这个
write(1, s, strlen(s));