永久一级传奇网站,台州网站seo外包,网站制作哪家公司好,恋月wordpress正常的文件描述符#xff1a; 在linux下#xff0c;通过open打开以文件后#xff0c;会返回一个文件描述符#xff0c;文件描述符会指向一个文件表#xff0c;文件表中的节点指针会指向节点表。看下图#xff1a; 打开文件的内核数据结构 dup和dup2两个函数都可以用来复制… 正常的文件描述符 在linux下通过open打开以文件后会返回一个文件描述符文件描述符会指向一个文件表文件表中的节点指针会指向节点表。看下图 打开文件的内核数据结构 dup和dup2两个函数都可以用来复制打开的文件描述符复制成功后和复制源共享同一个文件表。看下图 执行dup后的内核数据结构 1dup函数 fd1dupfd fd1和fd共享一个文件表对fd进行什么操作fd1也会有相应的操作fd和fd1是同步的。 具体解释 #incluestdio.h #includesys/types.h #includeunistd.h #includefcntl.h #includestdlib.h 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); //输出fd3 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 //fd3不等于fd1说明不共用同一个文件描述符。这也是dup和dup2的区别。 close(fd); close(fd1); return 0; } 2dup2函数 fd2 dup2fdfd1 fd2用的fd1第二个参数的描述符用的fd第一个参数的文件和fd共享一个文件表当然也共享文件偏移量 强调第几个参数是因为如果你写成fd2dup2fd1fd那么fd2 fd和fd1共享同一个文件表。 #incluestdio.h #includesys/types.h #includeunistd.h #includefcntl.h #includestdlib.h int main() { int fd open(file,O_RDWR|O_CREAT,0644); if(fd 0) printf(open error); printf(fd:%d\n,fd); //输出fd3 int fd1 open(text,,O_RDWR|O_CREAT,0644); if(fd1 0) printf(open error); printf(fd1:%d\n,fd1); //输出fd14 int fd2 dup2(fd,fd1); printf(fd2:%d\n,fd2); //输出fd24 //fd1 fd24说明fd2使用了fd1的文件描述符。 char buf[12]hello,world; write(fd,buf,12); //我们对fd进行了写并没有对fd2进行写 read(fd2,buf,12);//但是我们对fd2读的时候如果没有写怎么可能读出来呢 printf(fd2%s\nbuf)//事实是读出来了 //输出fd2helloworld //说明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共享文件偏移量。 closefd closefd2 return 0; } dup和dup2的区别 dupfd1 dupfd目标描述符使用了fd的文件表 dup2fd2 dup2fd1fd目标描述符使用了fd1的描述符使用了fd的文件表 转载于:https://www.cnblogs.com/linuxAndMcu/p/7668138.html