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

前端之家收集整理的这篇文章主要介绍了如何从两个进程同步 – 在一个文件上进行原子写入?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个进程,每个进程写大数据缓冲区,我想控制同步这些进程的写入到一个文件.

处理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,……).

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

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

猜你在找的Java相关文章