在Linux上,stdout
(fd 1)输出流被缓冲,而stderr
(fd 2)则没有。
说我做这样的事情:
int main() {
close(2);
open( "newfile.txt", O_WRONLY | O_CREAT | O_TRUNC, 0600 );
fprintf(stderr, "This is in the text file!");
fflush(stderr); //does this do anything? is it needed?
return 0;
}
如果我没记错的话,open
使用最低的可用文件描述符,该描述符应为2(在close
语句之前用作stderr)。由于stderr
未缓冲,newfile.txt
也不会被缓冲吗?或者fd 2曾经用于stderr
?
答案 0 :(得分:3)
你实际上并没有对stderr
做任何事情,所以它的状态和缓冲不变。您所做的只是更改基础文件描述符( 如果 open
调用当然没有失败)。
如果不关闭旧文件描述符,则可以通过保存返回的文件描述符open
并使用dup
或dup2
来执行相同的操作。我实际上建议使用dup2
代替,因为它更明确,更容易理解正在发生的事情:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int fd = open( "newfile.txt", O_WRONLY | O_CREAT | O_TRUNC, 0600 );
if (fd == -1) {
perror("open");
return EXIT_FAILURE;
}
if (dup2(STDERR_FILENO, fd) == -1) {
perror("dup2");
return EXIT_FAILURE;
}
fprintf(stderr, "This is in the text file!");
return EXIT_SUCCESS;
}
答案 1 :(得分:-1)
我认为你的代码很可能会出错,因为 fflush()
期望FILE*
不是Unix文件描述符。
fprintf()
缓冲输出。它并不知道任何不同,因为文件描述符并没有因此而改变,因此仍然需要fflush()
。