You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中如何通过共享内存向其他进程传输文件供其读取

共享内存传递文件的实现方案

1. 直接将文件拷贝到共享内存段(符合你仅用共享内存传输的要求)

这个方案可以绕过手动读文件封装结构体的步骤,实现效率更高:

  • 发送端先调用stat()获取目标文件的大小,按照文件总大小申请对应容量的共享内存段,大文件可以拆分多段传输,在段首加序号标记即可
  • 发送端可以直接用mmap()将目标文件映射到当前进程的地址空间,再通过memcpy()直接把映射后的整块文件内容拷贝到共享内存地址,不需要循环调用fread()读取文件
  • 建议在共享内存的前8个字节固定存储文件的实际字节长度,接收端读取时先提取该长度值,再读取对应长度的后续内容,避免读到共享内存的空白冗余数据
  • 如果需要同步传递文件名、修改权限这类元数据,只需在共享内存头部预留固定长度的存储区域即可,不需要复杂的结构体封装

2. 传递文件描述符(仅适用于同主机进程,不属于共享内存传输范畴)

如果不限定只能用共享内存,同主机的两个进程也可以通过传递文件描述符实现“直接传递文件”的效果:

  • 亲缘进程(父进程fork生成的子进程)默认可以继承父进程打开的文件描述符,无需额外传输操作
  • 非亲缘进程可以通过Unix域套接字的SCM_RIGHTS控制消息传递文件描述符,接收端拿到fd后可以直接读取对应文件的内容

注意事项

  • 共享内存传输必须配置同步机制,比如用信号量、互斥锁标记共享内存的读写状态,避免发送端未完成写入时接收端提前读取导致的数据损坏
  • 传输二进制文件时不要做字符串截断处理,严格按字节长度读写即可

内容的提问来源于stack exchange,提问作者1000 Years

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:36:01