gpt4 book ai didi

c - 在 C 中实际的 write() 什么时候发生?

转载 作者:行者123 更新时间:2023-12-01 15:11:58 25 4
gpt4 key购买 nike

write() 系统调用执行时到底发生了什么?

假设我有一个程序,它使用 write() 函数调用将某些数据写入文件。现在 C 库有自己的内部缓冲区,操作系统也有自己的缓冲区。

这些缓冲区之间发生了什么交互?

是否就像当 C 库缓冲区完全填满时,它写入操作系统缓冲区,当操作系统缓冲区完全填满时,然后在文件上完成实际写入?

我正在寻找一些详细的答案,有用的链接也会有所帮助。考虑 UNIX 系统的这个问题。

最佳答案

write() 系统调用(实际上所有系统调用)只不过是应用程序和操作系统之间的契约。

  • 对于“普通”文件,write() 仅将数据放入缓冲区,并将该缓冲区标记为“脏”
  • 在未来的某个时候,这些脏缓冲区将被收集并实际写入磁盘。这可以通过 fsync() 强制执行
  • 这是通过挂载文件系统表中的 .write()“方法”完成的
  • 这将调用硬件的 .write() 方法。 (这可能涉及另一层缓冲,例如 DMA)
  • 现代硬盘有自己的缓冲区,这些缓冲区可能会或可能不会实际写入物理磁盘,即使操作系统-> Controller 告诉他们这样做也是如此。

现在,一些(异常)文件没有 write() 方法来支持它们。想象一下 open()ing "/dev/null",然后 write()ing 一个缓冲区给它。系统可以选择不缓冲它,因为它永远不会被写入。

另请注意,write() 的行为确实取决于文件的性质;对于网络套接字,write(fd,buff,size) 可以在发送 size 个字节之前返回(write 将返回 已发送 的字符数)。但是,一旦它们被发送,就不可能找出它们在哪里。它们可能仍处于网络缓冲区中(例如等待 Nagle ...),或网络接口(interface)内的缓冲区,或路由器中的缓冲区或线路上某处的交换机。

关于c - 在 C 中实际的 write() 什么时候发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13048672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com