假設操作系統是linux。假設我打開一個文件進行寫入並獲取文件描述符fdw
。是否有可能獲得另一個文件描述符fdr
,只需訪問該文件而不再調用open
?我不想調用open
的原因是底層文件可能已被其他進程在文件系統中移動甚至解除鏈接,因此重新使用相同的文件名對於此類操作是不可靠的。所以我的問題是:無論如何打開一個文件描述符具有不同的訪問權限,如果只給一個文件描述符?我想,dup
或dup2
不會更改訪問權限。用另一個訪問重新打開一個文件描述符?
9
A
回答
9
是的!訣竅是通過/proc/self/fd/n
訪問已刪除的文件。就我所知,這只是一個linux專用的技巧。
運行這個程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
FILE* out_file;
FILE* in_file;
char* dev_fd_path;
char buffer[128];
/* Write 「hi!」 to test.txt */
out_file = fopen("test.txt", "w");
fputs("hi!\n", out_file);
fflush(out_file);
/* Delete the file */
unlink("test.txt");
/* Verify that the file is gone */
system("ls test.txt");
/* Reopen the filehandle in read-mode from /proc */
asprintf(&dev_fd_path, "/proc/self/fd/%d", fileno(out_file));
in_file = fopen(dev_fd_path, "r");
if (!in_file) {
perror("in_file is NULL");
exit(1);
}
printf("%s", fgets(buffer, sizeof(buffer), in_file));
return 0;
}
它寫一些文本文件,將其刪除,但保留的文件描述符和,然後通過不同的路線重新打開它。直到最後一個保存最後一個文件描述符的進程關閉文件,文件纔會被刪除,在此之前,您可以通過/proc
獲取文件內容。
感謝我的老上司阿納託利教我這一招,當我刪除是幸運還是被其它進程附加到一些重要的文件!
5
不,fcntl調用不會讓您在打開的文件描述符上設置讀/寫位,並且從現有文件描述符獲取新文件描述符的唯一方法是使用重複功能。撥打dup/dup2/dup3(和fcntl
)不允許您更改文件訪問模式。
注意:這對於Linux是正確的,但對於其他一般的Unix來說並非如此。例如,在HP-UX中[請參閱(1)和(2)],您可以使用打開的文件描述符上的F_SETFL來更改fcntl
的讀/寫位。由於由dup
創建的文件描述符共享相同的狀態標誌,但是,更改一個訪問模式將必然會改變另一個。
+0
還注意到'freopen'對'FILE *'流具有類似的功能,因爲訪問模式是否可以改變取決於OS的實現。 – CMCDragonkai
相關問題
- 1. 重新打開一個封閉的管道讀取文件描述符?
- 2. 如何訪問打開文件的文件描述符
- 3. 文件描述符和打開文件
- 4. 如何使一個文件描述符
- 5. 如何重新打開文件描述符0,1和2?
- 6. 如何從Maven Assembly插件的另一個描述符中調用描述符?
- 7. 在C中打開文件描述符
- 8. lsof的文件描述符被打開
- 9. 文件描述符,打開()返回零
- 10. 對同一個文件的多個文件描述符,C
- 11. 重定向到一個奇怪的文件描述符否
- 12. libevent無法讀取一個打開的套接字描述符
- 13. 管叉:跨多個孩子共用一個文件描述符
- 14. dup2將stdout和stderr重定向到另一個文件描述符
- 15. Linux中另一個進程的重複文件描述符(不帶sendmsg)
- 16. 獲取對一個套接字的文件描述符的訪問
- 17. 打開grb2文件重新訪問
- 18. 用文件描述符打開讀文件
- 19. perl:獲取一個新的文件描述符來將stdin重定向到
- 20. 打開()不打開for循環中的文件描述符
- 21. 從另一個文件打開一個GUI文件PyQT
- 22. 一個更描述
- 23. 對同一文件的兩個文件描述符
- 24. 如何將多個文件描述符合併爲一個?
- 25. BAT文件在另一個文件夾中打開另一個bat文件
- 26. 訪問描述符實例
- 27. 訪問描述符類
- 28. 打開另一個PHP文件
- 29. 如何將一個進程的stdout重定向爲另一個文件描述符3?
- 30. 訪問一次打開一個表格
這是作弊,因爲他明確表示「沒有再打開」 - 儘管我想如果你真的想這樣做,那是一個你會放鬆的限制。無論如何,他的意思可能是「沒有以相同的方式開放」。 – tvanfosson
謝謝。好答案。 –
什麼是'/ dev/proc/fd/n',是一個錯字?根據你的代碼,它似乎是'/ proc/self/fd /%d'。 – Mehrdad