高级I/O-----dup/dup2-创新互联
dup/dup2
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、网页空间、营销软件、网站建设、衢州网站维护、网站推广。dup/dup2是两个用于指定文件操作符的方法,作用很相似,它是得两个文件描述符指向同一个file结构体,使file的引用计数为2,所以在使用的时候我们需要手动关闭另外一个不需要的。
dup:
dup的作用是将文件描述符指向一个最小的文件描述符。
#includeint dup(int oldfd); int dup2(int oldfd, int newfd);
因为比较简单,就从代码来看吧
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #define _PATH_ "./test.log" 8 9 10 int main() 11 { 12 umask(0); 13 int fd=open(_PATH_,O_CREAT|O_WRONLY,0644);//打开一个新的文件 14 if(fd<0) 15 { 16 perror("open"); 17 } 18 close(1);//关掉需要用dup指向的文件描述符,注意(dup会使fd指向一个未使用的最 //小的文件描述符) 19 int new_fd=dup(fd);//现在1号文件描述符指向刚才open的文件 20 close(fd); //关闭之前open的文件描述符,如果不关闭,则从fd中也能网文件 //里写。 21 char buf[1024]; 22 while(1) 23 { 24 memset(buf,'\0',sizeof(buf)); 25 ssize_t size=read(0,buf,sizeof(buf)-1); 26 if(size>0) 27 { 28 buf[size]='\0'; 29 } 30 if(strncmp(buf,"quit",4)==0) 31 { 32 break; 31 { 32 break; 33 } 34 printf("%s",buf);//printf会输出到1号文件描述符中 35 fflush(stdout); 36 } 37 close(1); 38 return 0; 39 }
效果图
dup2:
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #define _PATH_ "./test.log" 8 9 int main() 10 { 11 umask(0); 12 int fd =open(_PATH_,O_CREAT|O_WRONLY,0644); 13 if(fd<0) 14 { 15 perror("open"); 16 } 17 close(1); //使用dup2所使用的重定向到的文件描述符必须先关闭 18 int newfd=dup2(fd,1); 19 close(fd);//关闭fd现在只有1号文件描述符指向所open的文件 20 char buf[1024]; 21 printf("%d\n",newfd); 22 while(1) 23 { 24 memset(buf,'\0',sizeof(buf)); 25 fgets(buf,sizeof(buf)-1,stdin); 26 if(strncmp(buf,"quit",4)==0) 27 { 28 break; 29 } 30 printf("%s",buf); 31 fflush(stdout); 32 } 33 return 0; 34 }
结果和dup一样
总结:
当需要往标准输出上打的调试信息,可以使用重定向的方式让它输出到相应的文件中。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章标题:高级I/O-----dup/dup2-创新互联
文章地址:http://scyanting.com/article/ddgipj.html