【发布时间】:2011-12-06 06:35:53
【问题描述】:
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
int main(int argc,char *argv[])
{
int oldfd;
int newfd;
if(argc!=2)
{
printf("Usgae : %s file_name\n",argv[0]);
exit(0);
}
oldfd=open(argv[1],O_RDWR|O_APPEND,S_IRWXU); // Opening the file in Read/Write mode
if (-1 == oldfd)
{
perror("Error opening file");
exit(0);
}
close(1); // closing stdout
newfd=dup(oldfd); //Now this newfd holds the value 1
close(oldfd); //closing the oldfd
printf("\nStack Overflow"); //Now this printf will print content into the file as stdout closed already
close(newfd);// closing newfd
return 0;
}
我实际上想要做的只是使用 printf() 而不是 write() 系统调用将“堆栈溢出”打印到文件中。
它没有将内容打印到文件中。但我观察到的一件事是,如果我删除代码:
close(newfd)
它按预期将内容打印到文件中。但我不明白为什么。我打印了内容,然后才关闭 newfd。
这是什么原因?
【问题讨论】:
-
例如,为了不经常写入磁盘。效率。
-
你为什么不直接使用
fprintf(fd, fmt, ...)?我不确定尝试重用 fd=1 是否是一个好主意,甚至是否已定义。 -
jedwards,我实际上是想知道为什么这不起作用:)