加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何从两个进程同步 – 在一个文件上进行原子写入?

发布时间:2020-12-14 05:55:24 所属栏目:Java 来源:网络整理
导读:我有两个进程,每个进程写大数据缓冲区,我想控制同步这些进程的写入到一个文件. 处理1写入缓冲器A包括(A1,A2,A3)和处理2写入缓冲器B,包括(B1,B2,B3).当我们使用write()系统调用将这些缓冲区写入磁盘到同一个文件时(整个缓冲区一次写入:write(fd,A,sizeof(A))
我有两个进程,每个进程写大数据缓冲区,我想控制同步这些进程的写入到一个文件.

处理1写入缓冲器A包括(A1,A2,A3)和处理2写入缓冲器B,包括(B1,B2,B3).当我们使用write()系统调用将这些缓冲区写入磁盘到同一个文件时(整个缓冲区一次写入:write(fd,A,sizeof(A))),文件架构如何?

>是这样的:A,B或B,A可能吗?
>或者它可能是这样的:A1,B1,A3,……

我问这个是因为系统调用是原子的.如果我们写的数据缓冲区太大会发生什么.它是否像常规磁盘文件的管道?

解决方法

如果要存在两个缓冲区的内容,则必须打开设置了O_APPEND标志的文件. append标志在写入之前寻找文件的末尾.如果没有此设置,则两个进程可能都指向文件的相同或重叠区域,而最后写入的任何一个将覆盖另一个写入的内容.

每次写入调用都会写入所请求的字节数.如果您的进程被信号中断,那么您最终可以进行部分写入 – 返回写入的实际字节数.无论你是否写入了所有的字节,你都会编写一个连续的文件部分.你没有得到你提到的交错效果作为你的第二种可能性(例如A1,……).

如果您只进行部分写作,您的工作方式取决于您.您可以继续写入(从缓冲区开始偏移先前写入的字节数),也可以放弃写入的其余部分.只有这样才能获得交错效果.

如果在另一个进程写入之前让一个写入的内容完成很重要,那么在尝试写入任何数据之前,您应该考虑锁定该文件以进行独占写入访问(两个进程都必须检查).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读