当前位置: 首页 > 面试题库 >

在UNIX中,文件附加原子吗?

贾俊艾
2023-03-14
问题内容

常,当我们从多个进程附加到UNIX中的文件时,我们可以理所当然地做什么呢?是否有可能丢失数据(一个进程覆盖另一个进程的更改)?数据有可能被破坏吗?(例如,每个进程向日志文件中的每个追加追加一行,是否有可能使两行混乱?)如果从上述意义上说,追加不是原子的,那么确保互斥的最佳方法是什么?


问题答案:

小于“ PIPE_BUF”大小的写操作应该是原子的。该长度至少应为512字节,尽管它可以轻易变大(Linux似乎将其设置为4096)。

假设您正在谈论所有完全符合POSIX的组件。例如,在NFS上并非如此。

但是,假设您写入在“ O_APPEND”模式下打开的日志文件并将行(包括换行符)的长度保持在“ PIPE_BUF”字节以下,则应该能够使多个写入者写入日志文件而不会出现任何损坏问题。任何中断都将在写入之前或之后到达,而不是在中间。如果希望文件完整性在重新启动后仍然存在,则还需要fsync(2)在每次写操作后调用它,但是这样会降低性能

澄清:请阅读评论和Oz Solomon的回答。我不确定O_APPEND应该具有这种PIPE_BUF原子性。这完全有可能是Linux的实现方式write(),或者可能是由于底层文件系统的块大小所致。



 类似资料:
  • 问题内容: 我正在尝试 将 字符串 追加 到日志文件。但是,writeFile每次写入字符串之前都会擦除内容。 任何想法如何以简单的方式做到这一点? 问题答案: 对于偶尔的追加,您可以使用,每次调用时都会创建一个新的文件句柄: 异步地: 同步:

  • 我是这里的 unix/linux 新手..完全新手。 我想在Unix环境下搜索大(日志)文件。因此,我尝试使用grep命令 然而,它只是快速滚动,我看不到所有的事件。我看到它已经完成了……可能是用管道将“”命令与其他命令连接起来。但我不知道是什么。基本上,我希望能够运行一个命令,查看输出,并在查看找到的结果时自己滚动该输出。 请帮帮我。。

  • 我正在使用Meteor并尝试将pdf附加到电子邮件中。我目前将pdf作为base 64字符串返回给客户端,该字符串在新窗口中打开并显示pdf。我想以pdf的形式将base 64附加为电子邮件附件。 邮寄服务器方法: 将base64字符串返回给客户端的代码段: 当前显示pdf的客户端代码: 为了将base64字符串作为pdf附件附加,我应该做些什么?我似乎无法获得流星邮件发送的数据,因为我收到了错误

  • 问题内容: 如何附加到文件而不是覆盖文件?有附加到文件的特殊功能吗? 问题答案:

  • 问题内容: 我有一个内容为的json文件。现在,我创建一个字典,我需要将其附加到json文件中。我尝试了以下操作,但无法正确执行。我要去哪里错了? 问题答案: 假设您有一个包含以下内容的文件: 接着,下面的代码将JSON文件,里面更新使用数据和到文件: 然后,在中,您将拥有: 希望这就是您想要的。

  • 问题内容: 我想发送带有PDF附件的电子邮件。我创建了PDF文件,然后执行了以下操作,但我认为这是错误的: 在发送电子邮件之前,我可以看到附件,但是当我发送电子邮件时,它的发送没有附件,这是因为我没有正确附加文件。 问题答案: 您错了。使用代替。