Linux下程序間傳遞描述符

2021-06-21 20:35:06 字數 1389 閱讀 3560

linux下程序間傳遞描述符

每個程序都有自己的程序空間,這使得描述符在程序間傳遞變得不容易。

就比如說linux下提供程序間傳遞描述符的機制,但是卻要求兩個程序是父子程序。

linux程序間傳遞描述符的機制是通過sendmsg和recvmsg兩個函式實現的;

該機制可以傳遞任意形式的描述符,如pipe、open、mkfifo、socket、accept等;

機制的原理:

1、程序間傳遞的描述符在核心層面實際上是同乙個描述符,只是核心對該描述符的引用標記是+n的,每傳送一次,引用次數+1;

//描述符傳遞給多個程序,但是如果其中乙個程序修改了描述符的屬性(如socket的同步/非同步),那麼所有程序的描述符的屬性都被改變了;

2、每close乙個描述符(傳送了多個程序,每個程序都需要close)都會在核心層面對該描述符的引用次數進行-1操作;

需要注意的地方:

1、在使用centos6.5環境下開發的過程中,發現socket描述符傳遞機制存在一點問題。從父程序傳送描述符到子程序接收這個過程中,核心層面描述符的引用次數並沒有立即+1。

2、我用父程序非同步傳送描述符,子程序接受描述符,但是如果父程序做完處理之後,過早close描述符,子程序接收到的描述符僅是乙個int型資料,並不是可以使用的描述符。

首先的介紹recvmsg和sendmsg的函式呼叫形式

ssize_t recvmsg(int sockfd, struct msghdr*msg, int flags);

ssize_t sendmsg(int sockfd, struct msghdr*msg, int flags);

msghdr等結構體的定義如下:

struct iovec {

void                   *iov_base;

size_t                 iov_len;

struct msghdr {

void                   msg_name;

socklen_t         msg_namelen;

struct iovec      *msg_iov;

size_t                 msg_iovlen;

void                    *msg_control;              //用於傳遞描述符的輔資料

size_t                 msg_controllen;

int                       msg_flags;

不過需要注意的是,有時候我們僅需要傳送描述符,但是我們不能不傳送實際資料!可以隨便傳送乙個char當做實際資料;

因為recvmsg和sendmsg的示例**網上一搜一大把,因此這些**在這裡我就不貼了;

Linux 程序間傳遞檔案描述符

程序間傳遞開啟的檔案描述符,並不是傳遞檔案描述符的值。先說一下檔案描述符。對核心來說,所有開啟的檔案都會通過檔案描述符引用,檔案描述符在程序中是乙個非負整數,檔案描述符在程序中是從0開始,預設0與標準輸入關聯 1與標準輸出關聯 2與標準出錯關聯。之後程序每開啟乙個檔案或者建立乙個新檔案的時候,核心都...

Linux 程序間傳遞檔案描述符

程序間傳遞開啟的檔案描述符,並不是傳遞檔案描述符的值。先說一下檔案描述符。對核心來說,所有開啟的檔案都會通過檔案描述符引用,檔案描述符在程序中是乙個非負整數,檔案描述符在程序中是從0開始,預設0與標準輸入關聯 1與標準輸出關聯 2與標準出錯關聯。之後程序每開啟乙個檔案或者建立乙個新檔案的時候,核心都...

android程序間傳遞檔案描述符原理

在linux中,程序開啟乙個檔案,返回乙個整數的檔案描述符,然後就可以在這個檔案描述符上對該檔案進行操作。那麼檔案描述符和檔案到底是什麼關係?程序使用的是虛擬位址,不同程序間是位址隔離的,如何在兩個程序中傳遞檔案描述符,然後指向同一檔案 binder傳遞檔案描述符 核心中每個程序都使用task st...