当我运行此
时close( 2 );
fd = open( "newfile.txt", O_WRONLY | O_CREAT | O_TRUNC, 0600 );
fprintf( stderr, "ERRORn" );
close( fd );
它将错误放在newfile中。
但是,当我运行这个
时close( 1 );
fd = open( "newfile.txt", O_WRONLY | O_CREAT | O_TRUNC, 0600 );
printf( "OUTPUTn" ); //fprintf( stdout, "OUTPUTn" );
close( fd );
什么也没有发生。newfile确实在文件描述符1中打开,但是printf不会通过。
我缺少什么吗?
我需要致电
fflush( stdout );
要冲洗缓冲区1到文件。
您将文件描述符从FILE *
下方更改,因此很自然会发生奇怪的事情。通常,最好避免这样做,或者如果您必须更改文件描述符,
-
使用
open
,dup2
,close
代替close
,open
,以表明您正在替换文件描述符, -
在使用
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("OUTPUTn");
// If you really need to close it later...
fflush(stdout);
close(STDOUT_FILENO);