当前位置: 首页 > news >正文

进程间通信之进程间传递文件描述符

        本文将给出进程间传递文件描述符的代码,代码篇幅不长,我在其中添加了必要的注释。可是想要看懂这些代码依旧并不容易。如果大家在阅读代码时遇到困难,可以根据情况阅读下面几篇文章:

  1. 高级IO函数之readv和writev-CSDN博客
  2. 高级IO函数之recvmsg和sendmsg-CSDN博客
  3. 进程间通信之管道-CSDN博客

示例代码:

#include <sys/socket.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>static const int CONTROL_LEN = CMSG_LEN( sizeof(int) );// 计算 msg.msg_controllen = CONTROL_LEN;的宏void send_fd( int fd, int fd_to_send )
{struct iovec iov[1]; // 关于该结构体大家可以看:高级IO函数之readv和writevstruct msghdr msg;char buf[0];iov[0].iov_base = buf;iov[0].iov_len = 1;msg.msg_name    = NULL;// 关于该结构大家可以看:高级IO函数之recvmsg和sendmsgmsg.msg_namelen = 0;msg.msg_iov     = iov;msg.msg_iovlen = 1;cmsghdr cm;cm.cmsg_len = CONTROL_LEN;cm.cmsg_level = SOL_SOCKET;cm.cmsg_type = SCM_RIGHTS;*(int *)CMSG_DATA( &cm ) = fd_to_send;msg.msg_control = &cm;msg.msg_controllen = CONTROL_LEN;sendmsg( fd, &msg, 0 );
}int recv_fd( int fd )
{struct iovec iov[1];struct msghdr msg;char buf[0];iov[0].iov_base = buf;iov[0].iov_len = 1;msg.msg_name    = NULL;msg.msg_namelen = 0;msg.msg_iov     = iov;msg.msg_iovlen = 1;cmsghdr cm;msg.msg_control = &cm;msg.msg_controllen = CONTROL_LEN;recvmsg( fd, &msg, 0 );int fd_to_read = *(int *)CMSG_DATA( &cm );// 取文件描述符数据的宏return fd_to_read;
}int main()
{int pipefd[2];int fd_to_pass = 0;int ret = socketpair( PF_UNIX, SOCK_DGRAM, 0, pipefd );// 创建两个相互通信的域间套接字assert( ret != -1 );pid_t pid = fork();assert( pid >= 0 );if ( pid == 0 ){close( pipefd[0] );fd_to_pass = open( "test.txt", O_RDWR, 0666 );send_fd( pipefd[1], ( fd_to_pass > 0 ) ? fd_to_pass : 0 );// 操作系统自动传递引用计数close( fd_to_pass );exit( 0 );}close( pipefd[1] );fd_to_pass = recv_fd( pipefd[0] );char buf[1024];memset( buf, '\0', 1024 );read( fd_to_pass, buf, 1024 );printf( "I got fd %d and data %s\n", fd_to_pass, buf );close( fd_to_pass );
}
http://www.dtcms.com/a/252086.html

相关文章:

  • 【JS-1】JavaScript的三种书写位置详解:内联、内部与外部
  • firewalld防火墙(一):基础概念、配置详解与实战应用
  • 数据库核心技术深度剖析:事务、索引、锁与SQL优化实战指南(第六节)-----InnoDB引擎
  • YOLOv4 训练与推理流程详解
  • Java并发编程实战 Day 23:并发系统性能调优
  • Android跨进程通信深度优化:从Binder机制原理到企业级实战指南
  • sparseDrive(2):环境搭建及效果演示
  • 【Linux服务器】-安装zabbix-负载环境(故障自动切换场景)
  • MySQL面试题(完整版一百道经典高频面试题)
  • LDPC码的译码算法
  • Node.js验证码:从生成到验证的趣味之旅
  • 语音转文本ASR、文本转语音TTS
  • 如何在 Elementary OS 上安装 Google Chrome 浏览器
  • Qdrant向量数据库的增删改查
  • 华为OD-2024年E卷-增强的strstr[100分] -- python
  • 通过 BLE 和 Wi-Fi 交换优化基于 ID 的远程无人机通信的延迟
  • ubuntu 22.04 安装部署logstash 7.10.0详细教程
  • VSCODE + EIDE 下 STM32 编程使用部分外设无法通过编译:undefined reference to ‘xxx‘
  • 基于 Transformer RoBERTa的情感分类任务实践总结之五——剪枝
  • 山东大学项目实训-创新实训-法律文书专家系统-项目报告(八)
  • vue中的h渲染函数
  • AI医生24小时在线:你的健康新‘算法监护人
  • 《江西南昌棒垒球》一级运动员 vs 二级运动员·棒球1号位
  • 【C/C++】内核开发之进程调度大纲
  • 2.4k star 开源项目,Wingman AI + 知识图谱,如何帮你搭建‘私人大脑’?学术/项目必备,让笔记真正活起来!
  • Softhub软件下载站实战开发(三):平台管理模块实战
  • 二.TvSettings从Android.bp解析成build.gradle
  • 【Bug】--docker的wsl版本问题
  • Java项目中使用到的技术——《异步调用》
  • K8s集群平台