函数原型:
#include
int dup(int oldfd);
int dup2(int oldfd,int newfd);
dup用来复制oldfd所指的文件描述符。但复制成功时返回最小的尚未被使用的文件描述符。若有错误则返回-1,错误代码存入errno中。返回的新文件描述符和参数oldfd指向同一个文件,共享所有的锁定,读写指针,和各项权限或标志位。

1.打开一个新文件

2.关掉标准输出文件符

3.调用dup给文件描述符

4.此时文件描述符变为1

5.将所要打印数据重定向到文件中

#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<string.h>#include<unistd.h>#include<fcntl.h>#include<sys/stat.h>#define_PATH_FILE_"./log"intmain(){umask(0);intfd=open(_PATH_FILE_,O_CREAT|O_RDWR,0644);if(fd<0){perror("open");return1;}close(1);intnew_fd=dup(fd);close(fd);intcount=0;while(count++<100){printf("heloworld\n");}fflush(stdout);//must,printf重定向后变为全缓冲,缓冲区满才会刷新,导致不会写入文件close(new_fd);return0;}

dup2

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#include<sys/types.h>#include<sys/stat.h>#define_FILE_"./log"intmain(){umask(0);intfd=open(_FILE_,O_CREAT|O_WRONLY,0644);if(fd<0){perror("open");return1;}close(1);//isn'tnecessaryintret=dup2(fd,1);if(ret<0){perror("dup2");return2;}charbuf[1024];while(1){memset(buf,'\0',sizeof(buf));fgets(buf,sizeof(buf)-1,stdin);//stdin是FILE*,0是文件描述符if(strncmp(buf,"quit",4)==0)//bufhave'\n',youcanbuf[_s-1]='\0'break;printf("hello:%s",buf);}close(fd);return0;}