3

在 unistd.h

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

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

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

我没有看到任何明显的方法来做到这一点..?有人知道吗?

谢谢

4

2 回答 2

0

要获取文件描述符中的当前位置,请使用lseek()offset0和 whence SEEK_CUR

int fd = open(...);
if (fd) {
    off_t positionWhereAppendingBegins = lseek(fd, 0, SEEK_CUR);
    write(...);
    close(fd);
}

请注意,如果描述符以其他方式打开,即 via ,这不会为您提供可靠的结果socket()

于 2010-11-17T17:18:04.243 回答
0

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

处理多个进程写入单个文件的正确方法是让所有进程使用 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.

于 2010-11-17T22:13:50.393 回答