原子追加文件描述符,但在什么偏移?

时间:2010-11-17 17:09:35

标签: c++ c linux posix unistd.h

在unistd.h中

使用带有O_APPEND标志的open()会将原子写入始终写入文件的末尾...

这很好,但是如果我需要知道它原子地附加到文件的偏移量怎么办?

我意识到O_APPEND经常被用于日志文件,但我实际上想知道它在原子上附加的文件中的偏移量。

我没有看到任何明显的方法来做这件事......?有谁知道吗?

由于

2 个答案:

答案 0 :(得分:0)

要获取文件描述符中的当前位置,请使用偏移lseek()的{​​{1}}和0

SEEK_CUR

请注意,如果以其他方式打开描述符,即通过int fd = open(...); if (fd) { off_t positionWhereAppendingBegins = lseek(fd, 0, SEEK_CUR); write(...); close(fd); } ,这将无法获得可靠的结果。

答案 1 :(得分:0)

文件被写入文件偏移量,这是文件打开时进程获得的。如果另一个进程在打开和写入之间写入文件,则该文件的内容是不确定的。

处理多个进程写入单个文件的正确方法是所有进程使用O_APPEND标志打开文件,获取独占锁定,一旦获得锁定,在写入文件之前寻找文件的末尾文件,最后关闭文件以释放锁。

如果要在写入之间保持文件打开,请通过使用O_APPEND标志打开文件来启动该过程。在这种情况下的写循环是获取独占锁,寻找到文件的末尾,写入文件并释放锁。

如果您确实需要文件位置,lseek将在调用时返回调用者文件描述符的文件偏移量。