dup/dup2
dup/dup2是两个用于指定文件操作符的方法,作用很相似,它是得两个文件描述符指向同一个file结构体,使file的引用计数为2,所以在使用的时候我们需要手动关闭另外一个不需要的。
dup:
dup的作用是将文件描述符指向一个最小的文件描述符。
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
因为比较简单,就从代码来看吧
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<sys/socket.h>
4 #include<string.h>
5 #include<fcntl.h>
6 #include<unistd.h>
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 #include<stdio.h>
2 #include<sys/types.h>
3 #include<sys/socket.h>
4 #include<string.h>
5 #include<fcntl.h>
6 #include<unistd.h>
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一样
总结:
当需要往标准输出上打的调试信息,可以使用重定向的方式让它输出到相应的文件中。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。