在 unistd.h
使用带有 O_APPEND 标志的 open() 可以始终将原子写入文件末尾...
这很好,但是如果我需要知道它以原子方式附加到文件的偏移量怎么办......?
我意识到 O_APPEND 通常用于日志文件,但我实际上想知道它原子附加的文件中的偏移量。
我没有看到任何明显的方法来做到这一点..?有人知道吗?
谢谢
要获取文件描述符中的当前位置,请使用lseek()
offset0
和 whence SEEK_CUR
。
int fd = open(...);
if (fd) {
off_t positionWhereAppendingBegins = lseek(fd, 0, SEEK_CUR);
write(...);
close(fd);
}
请注意,如果描述符以其他方式打开,即 via ,这不会为您提供可靠的结果socket()
。
文件被写入文件打开时进程获得的文件偏移量。如果另一个进程在打开和写入之间写入文件,则文件的内容是不确定的。
处理多个进程写入单个文件的正确方法是让所有进程使用 O_APPEND 标志打开文件,获得排他锁,一旦获得锁,在写入文件之前查找文件末尾,并且最后关闭文件以释放锁。
如果要在两次写入之间保持文件打开,请通过使用 O_APPEND 标志打开文件来启动该过程。这种情况下的写循环是获取排他锁,寻找文件末尾,写入文件并释放锁。
If you really need the file position, lseek will return the file offset of the callers file descriptor at the time of the call.