将一个进程中的描述字传递到另一个进程,并且使得该描述字依然有效。
传递描述符并不是传递一个int型的描述符编号,而是在接收进程中创建一个新的描述符,并且在内核的文件表中,它与发送进程发送的描述符指向相同的项。
实现过程包含如下:
(1) 创建一个数据报的unix domain socket套接口。
(2) 发送进程打开一个文件并获取其描述符。
(3) 发送进程创建一个msghdr结构,将(2)中待传递的描述字作为辅助数据发送,调用sendmsg跨越(1)中获得的套接口发送(2)中的描述符。
(4) 接收进程调用recvmsg在(1)中获取的套接口上接收该描述符。
注意:在发送过程中由于没有报文,在接收的过程中会分不清是文件已经结束还是只是发送了辅助数据,因此通常在发送辅助数据的时候会传输至少一个字节的数据,该数据在接收过程中不做任何的处理。
Server服务端例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#define BUFFER_SIZE 100
const char file_server_socket[] = "msghdr_tmp";
int main(int argc, char *argv[])
{
int listen_fd, cli_fd, rev_fd;
struct sockaddr_un server_addr, client_addr;
struct msghdr socket_msg;
struct cmsghdr