IT技术博客大学习 共学习 共进步

Linux 核心编程 – fsync, write

idea's blog 2012-03-25 20:52:33 浏览 3,465 次

write

ssize_t write(int fd, const void *buf, size_t count);

    将数据写到文件中. 注意, 如果文件是保存在硬盘中, write() 函数调用返回之后, 并不表示数据已经写入到硬盘中, 这时如果掉电, 数据可能会丢失.

fsync

int fsync(int fd);

    程序调用本函数, 通知内核把数据写到硬盘(file)中. 比如, 你开发一个数据库软件, 就需要这样的函数, 否则掉电或者系统崩溃时便会丢失数据.

    如果你的程序不调用 fsync(), Linux 内核也会自动在”合适”的时候将你的数据真正写入到硬盘(类似调用 fsync), 最长的延时默认是 30 秒.

阻塞

    阻塞是 IO 的精华所在, 不管是文件 IO 还是网络 IO, 只有真正了理解了 IO 阻塞, 才能做出所谓在高并发高性能软件(服务器).

    当 fsync() 和 write() 同一个 fd 时, write() 必然阻塞. 当系统 IO 非常繁忙时, fsync() 可能会阻塞, 即使系统 IO 不繁忙, fsync() 也会因为数据量大而慢.

    注: 许多 Linux 系统函数如 read(), write() 等, 粗看起来很简单, 也很容易用. 正如所有的事情一样, 要做到精致肯定不简单. 当你脱离初级的学习阶段, 要写真正生产环境的软件时, 这些”简单”的函数就大有门道了. 你需要不断的阅读它们的手册, 了解每一个参数, 每一个返回值, 同时还要阅读和试验在各种条件和环境下这些函数的表现, 这样, 才有可能做出真正的软件.

建议继续学习

  1. 关于IO的同步,异步,阻塞,非阻塞 (阅读 16,424)
  2. Linux下访问文件的基本模式 (阅读 4,103)
  3. MySQL在切换binlog时会阻塞更新 (阅读 3,922)
  4. 用insert delayed减少阻塞时间 (阅读 3,742)
  5. 总结一下遇到过的网络同步IO导致服务阻塞的问题 (阅读 3,582)
  6. write(2)在磁盘满的时候的行为 (阅读 2,600)
  7. PHP非阻塞实现方法 (阅读 2,586)
  8. 说说最近Google:safebrowsing引发页面加载阻塞的问题 (阅读 2,164)