繁体   English   中英

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

[英]atomic append on a file descriptor, but at what offset?

在unistd.h

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

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

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

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

谢谢

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

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

请注意,如果以其他方式打开描述符,即通过socket() ,这将不会给您可靠的结果。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM