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();
注意多程式下,只是共享了檔案描述符,可以理解共享了對相同的讀寫操作,但不是共享檔案控制程式碼,所以各個程式仍然要獨立地進行半閉的操作 (開啟時是在發起程式完成的。)
相關文章
- 程式碼安全之上傳檔案
- 修改linux最大檔案控制程式碼數Linux
- 檔案上傳/下載後臺程式碼
- 小程式之檔案上傳
- 微信小程式中的值傳遞微信小程式
- 米安程式碼審計 05 檔案上傳漏洞
- 跨國檔案傳輸軟體有哪些?跨國檔案傳輸遇到的問題
- 控制程式碼表篇——程式控制程式碼表
- 通過行為引數化傳遞程式碼
- chromium 之 CSS 解析過程(程式碼除錯)CSS除錯
- 學習過程中,專案檔案、程式碼疑惑點
- Atom 微信小程式檔案程式碼高亮微信小程式
- Vue實現多檔案上傳功能(前端 + 後端程式碼)Vue前端後端
- 介面測試如何在post請求中傳遞檔案
- 介面測試如何在 post 請求中傳遞檔案
- 什麼是檔案傳輸,介紹檔案傳輸的發展程式
- 程式碼安全之檔案包含
- PHP檔案跨伺服器上傳PHP伺服器
- 使用Flask-Dropzone在Flask程式中實現檔案上傳Flask
- Python中檔案讀取與儲存程式碼示例Python
- 整理課程中將程式碼納入Git程式碼版本控制Git
- [python網路程式設計]檔案上傳Python程式設計
- 記一次奇怪的檔案控制程式碼洩露問題
- MATLAB生成.coe檔案和.mif檔案程式碼示例Matlab
- sitemap 檔案填充示例程式碼
- bat檔案進度條程式碼BAT
- 根據api檔案生成程式碼API
- Linux檔案的顏色程式碼Linux
- gitHub_2 上傳專案程式碼Github
- 控制程式碼表篇——全域性控制程式碼表
- 線上直播系統原始碼,前後端大檔案上傳程式碼分析原始碼後端
- 跨國跨地域遠端檔案傳輸用什麼好呢?
- 在Spring Boot程式中上傳和下載檔案Spring Boot
- Springboot 一行程式碼實現檔案上傳 20個平臺!少寫程式碼到極致Spring Boot行程
- HttpClient多檔案上傳程式碼及普通引數中文亂碼問題解決HTTPclient
- 如何使用 ABAP 程式碼解析 XML 檔案XML
- 跨國檔案傳輸用什麼軟體?
- Asp.net WebApi 傳遞json資料以及上傳檔案ASP.NETWebAPIJSON
- apicloud拉起小程式並傳遞引數APICloud