【转】Linux系统编程 |
您所在的位置:网站首页 › dup2和dup › 【转】Linux系统编程 |
正常的文件描述符:
在linux下,通过open打开以文件后,会返回一个文件描述符,文件描述符会指向一个文件表,文件表中的节点指针会指向节点表。看下图: 打开文件的内核数据结构 dup和dup2两个函数都可以用来复制打开的文件描述符,复制成功后和复制源共享同一个文件表。看下图: 执行dup后的内核数据结构
(1)dup函数 fd1=dup(fd); fd1和fd共享一个文件表(对fd进行什么操作,fd1也会有相应的操作,fd和fd1是同步的)。 具体解释:
#inclue #include #include #include #include int main() { char buf[6]={0}; char buf1[6]={0}; int fd = open("file",O_RDWR|O_CREAT,0644); if(fd < 0) printf("open error"); printf("fd:%d\n",fd); //输出fd=3; write(fd,"hello,world",12); lseek(fd,0,SEEK_SET); //将文件偏移量置为0,就是从第一个字符开始读(h开始) read(fd,buf,5); printf("fd:%s",buf);//输出hello int fd1 = dup(fd); read(fd1,buf1,5); //之前做的是对fd的读写操作,并没有对fd1做任何操作。但在这对fd1进行了读,如果输出数据。说明fd和fd1是同步的(fd做了什么相当于fd1也做了什么) printf("fd1:%s\n",buf1); //输出,worl //既然输出的是fd中的内容,说明fd和fd1共用一个文件表,读到的是,worl,而不是hello(我们在上面将偏移量从第一个字符开始,输出hello之后,fd的偏移量距离开始有5个字符当我们再次读fd的时候,它是从第6个字符开始读的,很明显,第6个是逗号,往后读5个,就是,worl),说明偏移量是一致的。(其实不用写偏移量,因为共用文件表就意味着文件偏移量也共用) printf("fd1:%d\n",fd1);//输出fd1 = 4 //fd=3不等于fd1说明不共用同一个文件描述符。这也是dup和dup2的区别。 close(fd); close(fd1); return 0;
} (2)dup2函数
fd2 = dup2(fd,fd1); fd2用的fd1(第二个参数)的描述符,用的fd(第一个参数)的文件(和fd共享一个文件表,当然也共享文件偏移量) 强调第几个参数是因为如果你写成fd2=dup2(fd1,fd);那么fd2 =fd,和fd1共享同一个文件表。
#inclue #include #include #include #include int main() { int fd = open("file",O_RDWR|O_CREAT,0644); if(fd < 0) printf("open error"); printf("fd:%d\n",fd); //输出fd=3; int fd1 =open("text",,O_RDWR|O_CREAT,0644); if(fd1 < 0) printf("open error"); printf("fd1:%d\n",fd1); //输出fd1=4; int fd2 = dup2(fd,fd1); printf("fd2:%d\n",fd2); //输出fd2=4; //fd1 =fd2=4;说明fd2使用了fd1的文件描述符。
char buf[12]="hello,world"; write(fd,buf,12); //我们对fd进行了写,并没有对fd2进行写 read(fd2,buf,12);//但是我们对fd2读的时候,如果没有写,怎么可能读出来呢 printf("fd2:%s\n",buf);//事实是读出来了 //输出fd2:hello,world //说明fd和fd2共用一个文件表。
lseek(fd,5,SEEK_SET);//距离开始偏移5位,说明下次读的时候是从第6个开始,注意我们是对fd进行偏移,没有对fd2偏移 read(fd2,buf,5); //但是如果读fd2结果是从第6个字符开始的 buf[5]=0; //如果不写这句,输出的buf是按照12个字符输出的。因为定义buf的时候数组中可以放12个字符。 printf("fd2:%s\n",buf);//输出fd2:,worl //说明fd2和fd共享文件偏移量。 close(fd); close(fd2); return 0; } dup和dup2的区别 dup:fd1= dup(fd);目标描述符使用了fd的文件表 dup2:fd2 = dup2(fd1,fd)目标描述符使用了fd1的描述符,使用了fd的文件表 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |