Linux下进程间通信方式 进程间传递文件描述符——sockpair()函数

通过socketpair函数会生成两个类似于套接字的文件描述符,进程可以通过这两个文件描述符进行通信,

写入的一方可以通过msghdr结构体来进行文件描述符的发送,msghdr结构体其中有两个成员分别是iovec* iov和cmsghdr* cmsg,第一个成员无所谓,可以填充任意数据,就是要按照格式来填写,我们主要通过第二个成员来进行传递文件描述符,当结构体准备好了后就可以通过sendmsg函数发送

cpp 复制代码
int pipes[2];
socketpair(AF_LOCAL,SOCK_STREAM,0,pipes);

//写入方
msghdr msg;
iovec iov[2];
iov[0].iov_base = (char*)"edoyun";
iov[0].iov_len = 7;
iov[1].iov_base = (char*)"jueding";
iov[1].iov_len = 8;
msg.msg_iov = iov;
msg.msg_iovlen = 2;
//接下来才是真正要传递的数据
cmsghdr* cmsg = (cmsghdr*)calloc(1,CMSG_LEN(sizeof(int)));
if (cmsg == NULL)return -1;
cmsg->cmsg_len = CMSG_LEN(sizeof(int));
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
*(int*)CMSG_DATA(cmsg) = fd;
msg.msg_control = cmsg;
msg.msg_controllen = cmsg->cmsg_len;
ssize_t ret = sendmsg(pipes[1], &msg, 0);
free(cmsg);

接受的一方是一样的,就是反着来进行解析就好了

cpp 复制代码
//接收方
msghdr msg;
iovec iov[2];
char buf[][10] = { "","" };
iov[0].iov_base = buf[0];
iov[0].iov_len = sizeof(buf[0]);
iov[1].iov_base = buf[1];
iov[1].iov_len = sizeof(buf[1]);
msg.msg_iov = iov;
msg.msg_iovlen = 2;

cmsghdr* cmsg = (cmsghdr*)calloc(1, CMSG_LEN(sizeof(int)));
if (cmsg == NULL)return -1;
cmsg->cmsg_len = CMSG_LEN(sizeof(int));
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
msg.msg_control = cmsg;
msg.msg_controllen = CMSG_LEN(sizeof(int));
ssize_t ret = recvmsg(pipes[0], &msg, 0);
fd = *(int*)CMSG_DATA(cmsg);
相关推荐
charlie1145141912 小时前
嵌入式Linux驱动开发——新 API 字符设备驱动完整教程 - 从设备结构体到应用测试
linux·运维·驱动开发
飞Link2 小时前
2000 亿砸向算力:字节跳动 AI 基建跨越,后端与运维的“万亿 Token”生死战
运维·人工智能
消失的旧时光-19432 小时前
C语言对象模型系列(四)《Linux 内核里的 container_of 到底是什么黑魔法?》—— 一篇讲透 Linux 内核的“对象模型”核心技巧
linux·c语言·算法
SWAGGY..3 小时前
Linux系统编程:(二)基础指令详解
linux·运维·服务器
kdxiaojie3 小时前
U-Boot分析【学习笔记】(3)
linux·笔记·学习
烛衔溟3 小时前
TypeScript 接口继承与混合类型
linux·ubuntu·typescript
张文君3 小时前
上古世纪服务端编译安装AAEmu docker编译安装
运维·docker·容器
蜡笔婧萱3 小时前
Linux--远程登录服务ssh
linux·服务器·ssh
雾岛心情4 小时前
小铭邮件管理工具箱的界面(公司版)
运维·服务器·工具·o365·小铭邮件工具箱(公司版)
一只鹿鹿鹿4 小时前
数据库运维与管理规范(WORD)
运维·数据库