当前位置: 首页 > 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.xdnf.cn/news/1054063.html

相关文章:

  • 【杂谈】-剖析 LLMs 与 LRMs:人工智能推理的困境与展望
  • 深度学习---ONNX(Open Neural Network Exchange)
  • python zip() 函数的用法
  • 《一元线性回归:从基础到应用及模型处理》
  • centos7安装weblogic
  • linux多线程之线程基础
  • ATSAMV71Q21B基于Microchip Studio以及ASF4.0架构使用printf打印float类型
  • 超标量处理器设计9-执行
  • 647. 回文子串
  • AI驱动SEO关键词精准布局
  • PMP成本管理时,合同成本的计算和注意事项
  • 耗时3小时,把这两天做好的爬虫程序,用Python封装成exe文件
  • 构建高性能日志系统:QGroundControl日志模块深度解析
  • 【JavaEE】(2) 多线程1
  • 第3章 C#编程概述 笔记
  • 计算机求职提前批/求职什么时候投递合适
  • 宝塔部署.net项目(nopcommerce)
  • K-Means算法详细解析:从原理到实践
  • C++ STL常用二分查找算法
  • 2025年品牌定位推荐排行榜:锚定市场航向,解锁品牌增长新势能
  • Python+QT远程控制助手-ver2
  • 《注解的江湖:一场元数据的“宫斗剧”》
  • 每日算法刷题Day32 6.15:leetcode枚举技巧7道题,用时1h10min
  • 计网复习知识(17)应用层
  • jQuery 3D透明蓄水池状柱状图插件
  • IDA动态调试环境配置全流程
  • 【Markdown】基础用法汇总(标题、列表、链接、图片、加粗斜体、上下角标、引用块、代码块、公式)
  • 学习日记-day30-6.15
  • Linux安装LLaMA Factory
  • Netty 全面深入学习指南