linux进程间描述符的传递(sendmsg和recvmsg)

        将一个进程中的描述字传递到另一个进程,并且使得该描述字依然有效。

        传递描述符并不是传递一个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值