Linux進程間如何傳遞文件描述符?
12-31
不是通過fork複製的文件描述符,是進程間的文件描述符傳遞,試了用ioctl,但是一直報Bad address,不知道是什麼回事,求大神解答~
c - Can I share a file descriptor to another process on linux or are they local to the process?
問題已搞清楚,用IOCTL傳遞文件描述符的前提是使用Streams管道,Linux廢除了Streams,但是
ioctl依然保存了I_SENDFD的參數,這裡顯然是一個坑,調用的時候返回 "Inappropriate ioctl for device",(可以man 一下ioctl,並沒有這個錯誤,errno是25)。
所以在Linux可行的方案目前只能是unix socket的sendmsg。傳輸用輔助數據項msg_control,傳輸類型用SCM_RIGHTS。每個進程的文件描述符都是唯一的; 文件描述符是file_struct結構中的file(打開文件創建的對象)指針數組的索引,file對象只有打開文件時才會創建並與文件描述符相關聯fd_install(fd, f);
進程間傳遞文件描述符除了父子進程外,沒啥意義.父子進程之間會將file_struct的file指針數組全部拷貝,所以子進程才可以用父進程fd.
unix網路編程 第15章 unix domain socket 可以實現非同源進程間描述符傳遞我沒有看過源碼,我推測每一個進程都有一個描述符表,表項的內容指向了文件,表項的索引就是描述符。所以需要將描述符對應的表項拷貝到另一進程,而不是拷貝描述符。fork之後子進程可以沿用父進程的描述符是因為fork時描述符表被拷貝到了子進程的內存空間。
參考nginx的實現,使用socketpair通過unix domain socket來傳遞。
如何在進程之間傳遞文件描述符(file discriptor)這類問題google一下就出來了
SCM_RIGHTS - Send or receive a set of
open file descriptors from another
process. The data portion contains an
integer array of the file descriptors.
The passed file descriptors behave as
though they have been created with
dup(2).
sendmsg
apue裡面有常式,看了就明白了!
沒有必要的,可以搜搜進程文件表怎麼一回事
其實不理解 什麼場景下 需要在進程間傳遞1個打開的文件描述符? 為了節省打開的時間?資源?
首先你要理解文件描述符是什麼,再提傳遞的事情。你可以做個實驗打開同一個文件,看看文件描述符是不是一樣的。
推薦閱讀:
※linux下隱藏自己的文件和進程是如何做到的?
※如何理解Linux中的OOM(Out Of Memory Killer)機制?
※關於Linux的兩個問題?
※linux下沒有root許可權如何方便地安裝軟體?
※現在的 Linux 內核和 Linux 2.6 的內核有多大區別?