dup,dup2,dup3函数
顾名思义,dup及duplicate的简写,也就是复制的意思。而事实上这几个函数的功能也确实是复制文件描述符。那为什么要复制文件描述符呢?呵呵,我认为是程序员想偷懒,因为这个功能可以进行输入输出重定向。
下面这个程序将实现文件复制功能
1 #include<stdio.h> 2 #include<sys/types.h> 3 #include<fcntl.h> 4 #include<stdlib.h> 5 #include<sys/stat.h> 6 #include<unistd.h> 7 #include<errno.h> 8 #include<string.h> 9 10 void err_exit(const char *msg) 11 { 12 fprintf(stderr,"%s\n",msg); 13 exit(1); 14 } 15 16 int main(int argc, const char *argv[]) 17 { 18 if(argc != 3) 19 err_exit("Argument Error!"); 20 int fdr = open(argv[1],O_RDONLY); 21 if(fdr == -1) 22 err_exit(strerror(errno)); 23 int fdw = open(argv[2],O_CREAT | O_EXCL | O_RDONLY | O_RDWR,0666); 24 if(fdw == -1) 25 err_exit(strerror(errno)); 26 int fd_out = dup(STDOUT_FILENO);//保存标准输出文件描述符 27 int fd_in = dup(STDIN_FILENO); 28 29 dup2(fdw,STDOUT_FILENO); 30 dup2(fdr,STDIN_FILENO); 31 32 int data; 33 while((data = getc(stdin)) != EOF) 34 { 35 putc(data,stdout); 36 } 37 38 //printf("Hello Hjj\n");//这句将写入文件中 39 fflush(stdout); 40 close(fdr); 41 close(fdw); 42 dup2(fd_out,STDOUT_FILENO);//恢复标准输出 43 dup2(fd_in,STDIN_FILENO); 44 printf("Hello Hjj\n"); 45 return 0; 46 }
Linux编程 ---- dup函数
时间: 2024-11-04 21:11:52