dup、dup2复制的意义,实现文件共享操作,实现重定位,重定位命令 >【linux】(l)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了dup、dup2复制的意义,实现文件共享操作,实现重定位,重定位命令 >【linux】(l),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3113字,纯文字阅读大概需要5分钟。
内容图文
![dup、dup2复制的意义,实现文件共享操作,实现重定位,重定位命令 >【linux】(l)](/upload/InfoBanner/zyjiaocheng/943/a4b14bf9eb804c098e59b458bd123a83.jpg)
dup函数详细说明及用法,dup2函数详细说明及用法
实现文件共享操作
代码演示:
这样两个文件描述符就共享这个文件可以共同操作。
执行结果为:
我们可以看到在执行完成之后也没有出现内容覆盖的现象。
不会出现数据覆盖的说明
文件描述符表
使用dup、dup2复制方式实现文件共享时,不管复制出多少个文件描述符,它们永远只有一个文件表,使用同一个V节点,所以永远不会覆盖。所有文件描述符共享同一个文件位移量去操作文件时,不管复制了多少个文件描述符,不管谁操作后文件位移量都会被更新,因此不会出现覆盖。
实现重定位
重定位
某文件描述符原来指向了A文件,输出数据是输出到A文件,但是重定位后,文件描述符指向了B文件,输出时数据输出到了B文件,这就是重定位。
所谓重定位,说白了就是,文件描述符所指向的文件该变了,使得数据输出的目标文件也随之变。
使用dup、dup2实现重定位
回顾printf与write的关系:
printf输出时,原本通过1,将数据输出到标准输出文件(显示器)的,但是现在,我想让printf输出到file.txt文件,而不是输出到屏幕,应该怎么办?
最简单的办法是就是,把printf函数调用的write函数里面的1,改成指向file.txt文件的新描述符即可,但是不幸的是
write中的1写死了,1这个数字改不了,怎么办?
1这个数改不了,但是可以对1进行重定位,让1不再指向标准输出文件,而是指向file.txt,printf的数据,就输出到了file.txt文件中。
实现printf函数输出到文件而不是屏幕
(a)open file.txt文件,返回一个文件描述符,比如3
close(1),不要再让1指向标准输出文件(/dev/stdout)
使用dup、dup2把3复制到1上,让1也指向file.txt文件
1这个文件描述符就被重定位了,凡是通过1输出的数据,都被写到了file.txt中,printf底层调用的是write(1, …),用的也是1,printf的数据就被输出到了file.txt中。
相当于printf函数的输出目的地,被重定位为了新的文件,这就是重定位。
代码演示:
上面的代码在关闭文件描述符1之后对于printf进行调用打印,结果为:
我们可以看到关闭文件描述符为1的文件之后,printf函数没有办法将数据打印到屏幕上。
执行结果为:
上面代码我们没有指定赋值之后的新的文件描述符,因为当1关闭之后后面需要复制新的文件描述符的时候文件描述池中最小的没有被使用的就是文件描述符1。并且printf里面的内容都被写到文件里面,因为文件描述符1被关闭之后被复制到了文件描述符3上面,这时文件描述符1和文件描述符3都指向了dup.txt文件,所以printf的内容都被输入到文件描述符3所操作的dup.txt文件。
实现scanf函数从文件读取数据而不从键盘
执行结果为:
我们输出并打印从文件输入到程序的数据:
函数中的文件描述符值写死了,无法修改为新的描述符,但是你又希望该函数,把数据输出到其它文件中,此时就可以使用dup、dup2对该函数中的文件描述符,进行重定位,指向新的文件,函数就会将数据输出到这个新文件。
重定位命令 >
重定位 命令(>)是dup、dup2的典型应用,这个命令在重定位时,就是调用dup、dup2函数来实现的。
使用的例子:
ls > file.txt
ls的结果原本是输出到显示器的,但是>从定位后,就输出到了file.txt文件。
我们使用一下:
>命令过程分析
(a)>命令(程序)会open打开file.txt文件,假设返回的文件描述符是3
(b)ls命令(程序)原本会调用write(1, …),将结果输出到标准输出文件(显示器),但是 >会调用dup2,把3复制到1上,实现重定位,让1也指向file.txt文件,ls的结果自然就输出到file.txt文件了。
所以>命令就完成实现。
熟练的初学者 发布了65 篇原创文章 · 获赞 71 · 访问量 8051 私信 关注内容总结
以上是互联网集市为您收集整理的dup、dup2复制的意义,实现文件共享操作,实现重定位,重定位命令 >【linux】(l)全部内容,希望文章能够帮你解决dup、dup2复制的意义,实现文件共享操作,实现重定位,重定位命令 >【linux】(l)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。