如何通过 sync() 方法实现 FileDescriptor 文件描述符的内核缓冲区与物理磁盘同步?

2026-04-30 11:571阅读0评论SEO基础
  • 内容介绍
  • 相关推荐

本文共计1466个文字,预计阅读时间需要6分钟。

如何通过 sync() 方法实现 FileDescriptor 文件描述符的内核缓冲区与物理磁盘同步?

plaintextsync() 方法本身不操作 FileDescriptor(文件描述符),也不直接作用于某个具体文件或 FileDescriptor 实例。它是一个全局、无参的系统调用。

作用对象是整个内核的 页缓存(page cache) 和 块设备缓冲区(buffer cache),而非某个打开的文件句柄。

下面从底层逻辑讲清楚它到底做了什么、为什么和 FileDescriptor 无关,以及它真正同步的是哪些“内核缓冲区变量”。


sync() 不接收 FileDescriptor,也不按文件粒度工作

  • sync() 是 POSIX 定义的系统调用(#include <unistd.h>),原型为:

    void sync(void);

    它没有参数,无法指定文件、路径或 int fd

  • Java 的 FileDescriptor.sync() 是对 fsync(fd) 的封装(针对单个 fd),不是 sync();而 Linux 命令行里的 sync 命令调用的正是 sync() 系统调用——二者常被混淆,但语义完全不同。
阅读全文

本文共计1466个文字,预计阅读时间需要6分钟。

如何通过 sync() 方法实现 FileDescriptor 文件描述符的内核缓冲区与物理磁盘同步?

plaintextsync() 方法本身不操作 FileDescriptor(文件描述符),也不直接作用于某个具体文件或 FileDescriptor 实例。它是一个全局、无参的系统调用。

作用对象是整个内核的 页缓存(page cache) 和 块设备缓冲区(buffer cache),而非某个打开的文件句柄。

下面从底层逻辑讲清楚它到底做了什么、为什么和 FileDescriptor 无关,以及它真正同步的是哪些“内核缓冲区变量”。


sync() 不接收 FileDescriptor,也不按文件粒度工作

  • sync() 是 POSIX 定义的系统调用(#include <unistd.h>),原型为:

    void sync(void);

    它没有参数,无法指定文件、路径或 int fd

  • Java 的 FileDescriptor.sync() 是对 fsync(fd) 的封装(针对单个 fd),不是 sync();而 Linux 命令行里的 sync 命令调用的正是 sync() 系统调用——二者常被混淆,但语义完全不同。
阅读全文