stdout
is a FILE*
给出标准输出流的指针。很明显fprintf(stdout, "x=%d\n", x);
具有相同的行为printf("x=%d\n", x);
;你用stdout
for <stdio.h>
函数如fprintf()
, fputs()
etc..
STDOUT_FILENO
是一个整数文件描述符(实际上是整数1)。你可能会用它来write
系统调用。
两者之间的关系是STDOUT_FILENO == fileno(stdout)
(Except after you do weird things like fclose(stdout);
, or perhaps some freopen
after some fclose(stdin)
, which you should almost never do! See this /q/25516375/4279, as commented by J.F.Sebastian /users/4279/j-f-sebastian)
您通常更喜欢FILE*
的东西,因为它们是缓冲的(所以通常表现良好)。有时,您可能想打电话fflush()
刷新缓冲区。
您可以使用文件描述符编号syscalls http://en.wikipedia.org/wiki/Syscall例如write() http://www.kernel.org/doc/man-pages/online/pages/man2/write.2.html(这是由stdio
图书馆),或poll() http://www.kernel.org/doc/man-pages/online/pages/man2/poll.2.html。但使用系统调用很笨拙。它可能会给你带来非常好的效率(但这很难编码),但很多时候stdio
库足够好(而且更便携)。
(当然你应该#include <stdio.h>
对于 stdio 功能,以及#include <unistd.h>
- 以及其他一些标头 - 对于系统调用,例如write
。并且stdio函数是通过系统调用实现的,所以fprintf()
可能会打电话write()
).