Chromium中跨程式檔案控制程式碼傳遞
實現說明
在Chromium跨程式架構下,也會有Browser/Renderer兩個程式對相同檔案進行操作的需求。比如Browser的某個任務依賴於Renderer端對指定檔案的輸出。而在POXIS下,允許不同程式間傳遞檔案描述符(File Descriptor))的, 比如傳遞socket,或者普通檔案,進而可以達到不需要重新開啟檔案,而對相同檔案讀寫的效果(並不是分享檔案控制程式碼)。Chromium對這個特性做了封裝,也包括了Windows下的實現(也包括了Windows下的實現)。涉及的基本結構如下:
其中dbus::FileDescriptor
,定義在dbus/file_descriptor.h中。因為安全原因不能傳遞目錄的FD。
base::File
是對不同平臺檔案控制程式碼的封裝,定義在base/file.h中。
PlatformFile是一組函式,定義在base/ipc_platform_file.h,其中兩個重要的API是:
IPC_EXPORT PlatformFileForTransit GetFileHandleForProcess(
base::PlatformFile file,
base::ProcessHandle process,
bool close_source_handle);
引數解釋:
base::PlatformFile file,
// 當前程式開啟的檔案控制程式碼
base::ProcessHandle process,
// 目標process
bool close_source_handle);
// 是否會關閉當前的檔案控制程式碼,如果不會,就需要多建立當前檔案控制程式碼的副本,以避免IPC傳遞時出現異常。否則就複用當前的檔案描述符(File descriptor,Windows下為Handle)。
IPC_EXPORT PlatformFileForTransit TakeFileHandleForProcess(
base::File file,
base::ProcessHandle process);
這個版本就是GetFileHandleForProcess第三個引數(close_source_handle)為true的情況,這時當前程式不需要再持有這個檔案控制程式碼,看起來像是將所有權也轉移到目標程式。
使用示例
// MHTMLGenerationManager (Browser)
void MHTMLGenerationManager::StreamMHTML(
WebContents* web_contents,
base::File browser_file, // 傳入一個檔案控制程式碼browser_file
const GenerateMHTMLCallback& callback) {
// 轉換到跨程式的FD, 並不釋放所有權,所以第三個引數傳遞的是false。
PC::PlatformFileForTransit renderer_file =
IPC::GetFileHandleForProcess(browser_file.GetPlatformFile(),
renderer_process, false);
// 隨後在FileAvailable函式將renderer_file傳遞出去。
rvh->Send(new ViewMsg_SavePageAsMHTML(rvh->GetRoutingID(), job_id,
renderer_file));
}
經過IPC,傳遞到Renderer程式。
// MHTMLGenerator (Renderer)
void MHTMLGenerator::OnSavePageAsMHTML(int job_id, IPC::PlatformFileForTransit file_for_transit) {
// 從訊息中的FD,轉換到base::File, 可以進行相關的檔案操作了。
base::File file_ = IPC::PlatformFileForTransitToFile(file_for_transit);
int bytes_written = file_.Write(total_bytes_written,
data + total_bytes_written, copy_size);
file_.Close();
注意多程式下,只是共享了檔案描述符,可以理解共享了對相同的讀寫操作,但不是共享檔案控制程式碼,所以各個程式仍然要獨立地進行半閉的操作 (開啟時是在發起程式完成的。)
相關文章
- 程式碼安全之上傳檔案
- javaWeb上傳檔案程式碼JavaWeb
- 在父子程式間用管道傳遞檔案描述符
- 微信小程式中的值傳遞微信小程式
- Vue 單檔案中的資料傳遞Vue
- 修改linux最大檔案控制程式碼數Linux
- 米安程式碼審計 05 檔案上傳漏洞
- Java檔案上傳功能程式碼——普遍適用Java
- Android Binder跨程式與非跨程式的傳輸異同原始碼分析Android原始碼
- 最程式碼的上傳的程式碼檔案儲存什麼地方呢?
- 檔案控制程式碼、檔案描述符與程式和多執行緒的那些事執行緒
- 小程式之檔案上傳
- CORS跨域cookie傳遞CORS跨域Cookie
- perl檔案上傳程式,支援多檔案! (轉)
- 通過檔案控制程式碼恢復刪除的資料檔案
- 檔案上傳本地預覽js程式碼例項JS
- 誰有檔案上傳的好的程式碼呢?
- 跨國檔案傳輸軟體有哪些?跨國檔案傳輸遇到的問題
- 在html檔案中執行php程式碼HTMLPHP
- 通過行為引數化傳遞程式碼
- 介面測試如何在post請求中傳遞檔案
- 介面測試如何在 post 請求中傳遞檔案
- js檢測上傳檔案型別程式碼例項JS型別
- C# FTP上傳檔案至伺服器程式碼C#FTP伺服器
- Linux下誤刪資料檔案從檔案控制程式碼恢復資料檔案Linux
- 控制程式碼表篇——程式控制程式碼表
- chromium 之 CSS 解析過程(程式碼除錯)CSS除錯
- 批量去除PHP檔案中bom的PHP程式碼PHP
- 學習過程中,專案檔案、程式碼疑惑點
- PHP檔案跨伺服器上傳PHP伺服器
- 後臺接受ajax傳遞值的例項程式碼
- 給url傳遞的引數值編碼程式碼例項
- 什麼是檔案傳輸,介紹檔案傳輸的發展程式
- Vue實現多檔案上傳功能(前端 + 後端程式碼)Vue前端後端
- 整理課程中將程式碼納入Git程式碼版本控制Git
- Atom 微信小程式檔案程式碼高亮微信小程式
- Java 應用程式中的按值傳遞語義 (轉)Java
- 程式碼安全之檔案包含