它經常會注意到,如果已經有方法創建「虛擬FILE
」併爲緩衝區滿了,輸入請求,關閉,沖洗等事件附加必要的回調,我將能夠優雅地解決C中的實際問題。然後應該可以使用大部分的功能,例如, fprintf
不變。 有沒有一個框架可以做到這一點?如果不是,至少在某些平臺上,適度的努力是否可行?虛擬化C的FILE *接口有多大的可行性?
可能的應用是:
- 寫入或從存儲器的動態或靜態區域讀取。
- 並行寫入多個文件。
- 從線程或協同例程中讀取數據。
- 將過濾器應用於其他(虛擬或實際)
FILE
。 - 支持間接文件格式(如
#include
)。 - C預處理器(?)。
我不是在一個框架不太感興趣的特定情況下的解決方案,讓你滾你自己FILE
。我也不是在尋找一個虛擬文件系統,而是我可以傳遞給CRT的虛擬FILE*
。
令我失望的是,我從未見過這樣的事情;就我所見,C11認爲FILE
完全取決於語言實現者,如果希望將語言(+庫)規範保持爲小而悲傷,如果將其與Java I/O流進行比較,這可能是合理的。我覺得虛擬FILE
必須可以用C運行時的任何(完全)開源實現,但我想可能有大量的細節使它比看起來更復雜,如果它已經完成了,重複這些努力將是一件恥辱。最好不要修改CRT代碼。如果沒有開源代碼,人們可能會對所提供的功能進行逆向工程,但是我擔心,除非承諾使用一組接口,否則結果將太脆弱,無法修改不支持的功能。我想,任何一個可以編寫設備驅動程序的系統都可以創建一個虛擬設備,但我懷疑是不必要的低層次,需要編寫特權代碼。
我不得不承認,雖然我的代碼可以從虛擬FILE
中受益,但我目前沒有這方面的要求;儘管如此,這是我經常想到的事情,而且我想其他人可能會感興趣。
這有些類似於a-reader-interface-that-consumes-files-and-char-in-c,但是那裏的提問者不希望返回虛擬的FILE
;但是,答案是fmemopen
,確實如此。
你看過[libfuse](http://fuse.sourceforge.net/)嗎?它允許你通過回調實現你自定義的文件系統(ioctl,read,stat,write,...) – mpromonet
@mpromonet:不,我不熟悉libfuse,但是你的描述聽起來很有希望......但是當我看起來我看到它聽起來有點不同:我想要一個虛擬的(C)'FILE',我可以傳遞給例如'fprintf',而不是虛擬文件(在存儲介質上)。但我認爲libfuse可能會使用相關技術。 – PJTraill
C是*旨在*被設計爲沒有I/O。所有的I/O都藏在圖書館裏。這使得C便攜。 C中有什麼文件?可能是一個字節數組;但也許是可以尋求的。語義可能會蔓延,但僅限於語義層面。 – wildplasser