簡體   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