没有从printf输出到文件描述符C.

时间:2017-02-23 03:53:26

标签: c stdout file-descriptor

当我运行时

close( 2 );
fd = open( "newfile.txt", O_WRONLY | O_CREAT | O_TRUNC, 0600 );
fprintf( stderr, "ERROR\n" );
close( fd );

它将ERROR放入newfile。

但是当我运行这个

close( 1 );
fd = open( "newfile.txt", O_WRONLY | O_CREAT | O_TRUNC, 0600 );
printf( "OUTPUT\n" ); //fprintf( stdout, "OUTPUT\n" );
close( fd );

什么都没发生。 newfile确实在文件描述符1中打开,但是printf没有通过。

我有什么遗失的东西吗?

2 个答案:

答案 0 :(得分:1)

您正在从FILE *下改变文件描述符,因此奇怪的事情发生是非常自然的。一般来说,最好不要这样做,或者如果你必须更改文件描述符,

  • 使用opendup2close代替closeopen以明确您正在替换文件描述符,

  • 在使用stdio之前,请在程序的最开头进行所有更改。

如果您仍想弄乱文件描述符,请按以下步骤操作:

int fd = open("newfile.txt", O_WRONLY | O_CREAT | O_TRUNC, 0600);
if (fd == -1) {
    err(1, "newfile.txt");
}
fflush(stdout);
int r = dup2(fd, STDOUT_FILENO);
if (r == -1) {
    err(1, "dup2");
}
close(fd);

printf("OUTPUT\n");

// If you really need to close it later...
fflush(stdout);
close(STDOUT_FILENO);

答案 1 :(得分:0)

我需要致电

fflush( stdout );

将缓冲区1刷新到文件中。