在unistd.h中
使用带有O_APPEND标志的open()会将原子写入始终写入文件的末尾...
这很好,但是如果我需要知道它原子地附加到文件的偏移量怎么办?
我意识到O_APPEND经常被用于日志文件,但我实际上想知道它在原子上附加的文件中的偏移量。
我没有看到任何明显的方法来做这件事......?有谁知道吗?
由于
答案 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将在调用时返回调用者文件描述符的文件偏移量。