![Linux 上 O_APPEND 模式下文件的原子写入和告诉](https://linux22.com/image/154444/Linux%20%E4%B8%8A%20O_APPEND%20%E6%A8%A1%E5%BC%8F%E4%B8%8B%E6%96%87%E4%BB%B6%E7%9A%84%E5%8E%9F%E5%AD%90%E5%86%99%E5%85%A5%E5%92%8C%E5%91%8A%E8%AF%89.png)
我正在处理一种情况,我想为具有许多进程和这些进程中的许多线程的应用程序持久保存状态。通常这需要大量使用锁定来确保不存在冲突。
我希望通过使用 O_APPEND 模式将数据保存到文件中来避免这种情况。这样只要我保证数据<4KiB写入文件就会是原子的。如果我使用仅附加数据结构,那么我就有一个无锁解决方案。
但是,为了使其正常工作,我需要在写入该文件后知道该文件中数据的位置。我遇到的问题是,我无法找到写入文件的系统调用,然后告诉我写入的文件内的偏移量。
我可以使用写入和查找来发现这个位置。但是,如果另一个线程共享相同的文件描述符,那么这是不安全的,因此需要我使用互斥锁来保护写入,这违背了我避免锁定的努力。
检查 write、writev、pwrite 和 prwritev 的手册页没有显示任何可以执行写入操作,然后告诉我写入后作为单个系统调用的偏移量的内容,我完全知道可能不会。我是不是看太多了?