[Android]文件描述符透過Binder傳輸的原理

在Linux中,文件描述符都是屬於進程的,用整數來表示。經過fork,雖然子進程和父進程都是打開一樣的文件,但文件描述符倒是不一樣的。 一樣的文件描述符值在不一樣進程對應不一樣的文件描述符值數組。 因此文件描述符透過Binder來進行傳輸時,不能是簡單的拷貝文件描述符值。 關鍵是要把對應的文件結構與一個新的文件描述符對應起來,這樣另外一個進程和原來的進程透過不一樣的文件描述符對應同一個文件。 幸虧,打開文件的結構struct file是能夠在進程間共享的,透過進程a的文件描述符來獲取struct file,再在進程b中獲取一個新的空文件描述符,再把它們關聯起來,就實現了文件描述符在不一樣進程之間的傳輸。數組

關鍵函數及結構 int filedescripter; //透過文件描述符獲取打開文件struct file 結構 strcut file = fget(filedescripter)函數

//獲取空的文件描述符 new_fd = task_get_unused_fd_flags(target_proc, O_CLOEXEC);.net

//創建關聯 task_fd_install(target_proc, new_fd,strcut file);blog

參考: 《 Android系統匿名共享內存Ashmem(Anonymous Shared Memory)在進程間共享的原理分析 》 http://blog.csdn.net/luoshengyang/article/details/6666491進程

相關文章
相關標籤/搜索