免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 19986 | 回复: 7
打印 上一主题 下一主题

pread和pwrite的意义何在? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-15 20:58 |只看该作者 |倒序浏览
apue上说pread和pwrite是一种原子的lseek和read/write. 但是我就不明白了,这原子不原子有关系吗?就算你先lseek定位到某一位之,然后再read/write也不会出现任何问题。唯一出问题的就是append数据的时候,需要每次都在末尾读写,但是多进程append时用O_APPEND就可以了,pread和pwrite也不管用啊,因为末尾是一个相对的位置,而不是一个绝对的位置,你pread/pwrite的最后哪个offset没法写啊。

既然这样的话,pread和pwrite到底用在什么地方呢?

论坛徽章:
0
2 [报告]
发表于 2010-03-15 21:27 |只看该作者
apue上说pread和pwrite是一种原子的lseek和read/write. 但是我就不明白了,这原子不原子有关系吗?就算你先 ...
beingmaster 发表于 2010-03-15 20:58



    我倒没听说过这两个函数有什么原子特性,它们只是在读写时都不会改变文件当前的offset。假设当前文件的offset是0,那么pwrite 10个字节进去,offset还是0。pread类似。
   用处嘛,我能想到的就是把这个文件作为一个buffer一样的东西,这边写进去,那边读出来,省掉了要lseek的动作

论坛徽章:
0
3 [报告]
发表于 2010-03-16 09:25 |只看该作者
就是因为历史上有些系统不支持O_APPEND,才定义了pread和pwrite。

如果没有O_APPEND,那多进程lseek,Write文件就会有问题。

论坛徽章:
0
4 [报告]
发表于 2010-03-16 11:39 |只看该作者
pread和pwrite  很少用

论坛徽章:
0
5 [报告]
发表于 2010-03-16 19:41 |只看该作者
因为lseek与read之间,可能会出现非预期的效果,所以定义pread。另外随机访问的话,pread/pwrite比较方便。

论坛徽章:
0
6 [报告]
发表于 2010-03-16 20:05 |只看该作者
1 用于多线程磁盘文件操作
2 APUE中的那段话所谓的“原子性”从语义上讲与O_APPEND模式的write相同。
3 用这两个调用模拟O_APPEND解决竞争是不可能的,必然导致新的竞争——你怎么知道文件现在的文件长度?
4 处理多线程磁盘文件操作时,不用这两个调用很麻烦。同情“很少用”的人。
...

论坛徽章:
0
7 [报告]
发表于 2010-03-16 20:37 |只看该作者
1 用于多线程磁盘文件操作
2 APUE中的那段话所谓的“原子性”从语义上讲与O_APPEND模式的write相同。
3 用 ...
JohnBull 发表于 2010-03-16 20:05



    你的意思是,多线程操作一个文件时,那几个线程使用的是同一个文件描述符? 这样还真的用原子操作了。。。但是我每个线程都open一次,使每个线程的fd虽然是同一个文件,但是文件表不同,那不就各自的seek都互不干扰了吗

论坛徽章:
0
8 [报告]
发表于 2010-03-17 11:40 |只看该作者
你的意思是,多线程操作一个文件时,那几个线程使用的是同一个文件描述符? 这样还真的用原子操作 ...
beingmaster 发表于 2010-03-16 20:37



    问题是不是什么文件都能open的,如匿名文件。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP