分类:
2010-09-18 10:52:43
int sfd;
sfd = dup (STDOUT_FILENO); /* save */
....
dup2 (sfd, STDOUT_FILENO); /* restore */
fflush (stdout);
#include;
#include;
#include;
#include;
#include;
int main()
{
int sfd,testfd;
testfd = open("temp",O_CREAT | O_RDWR | O_APPEND);
if (-1 == testfd) {
printf("open file error.\n");
exit(1);
}
/* 先复制一个真实的文件描述符 */
sfd = dup(testfd);
/* 保存标准输出 */
if (-1 == dup2(STDOUT_FILENO,sfd) ) {
printf("can't save fd \n");
exit(1);
}
/* 重定向 */
if (-1 == dup2(testfd,STDOUT_FILENO) ) {
printf("can't redirect fd error\n");
exit(1);
}
/* 此时向stdout写入应该输出到文件 */
write(STDOUT_FILENO,"file\n",5);
/* 恢复stdout */
if (-1 != dup2(sfd,STDOUT_FILENO) ) {
printf("recover fd ok \n");
/* 恢复后,写入stdout应该向屏幕输出 */
write(STDOUT_FILENO,"stdout\n",7);
}
}
sfd = dup(testfd);
sfd = dup(testfd);
#include;
#include;
int main(void)
{
FILE *fp;
int fd, id;
id = dup(STDOUT_FILENO);//这时id和STDOUT_FILENO一起指向stdout
if ((fp = fopen("install.log", "w")) == NULL) {
perror("read error.\n");
exit(-1);
}
fd = fileno(fp);//得到fp的文件描述符
dup2(fd, STDOUT_FILENO);//STDOUT_FILENO和stdout流断开, //STDOUT_FILENO指向fd的对应文件,这样使输出到达fd的文件
//fd对应的是已经打开的文件install.log,//而stdout在这里指的是终端,现在任何的输入都输入到
//install.log中
printf("hello\n");
fflush(stdout);//刷新stdout上的缓冲区,这样前面的hello写入文件//install.log中
dup2(id, STDOUT_FILENO);
printf("world\n");
fclose(fp);
return 0;
}
sfd = dup(testfd);
dup2(STDOUT_FILENO,sfd);