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

C语言不使用msgget、msgsnd等专用函数实现进程间消息传递的方法

父子进程间不使用System V消息队列的通信实现方案

可选核心实现技术

  • 管道(Pipe):最经典的父子进程通信方式,半双工,适合单向数据传输。创建管道后调用fork(),父子进程关闭各自不需要的读写端即可完成数据传输,若需双向通信可创建两组管道。
    基础实现代码示例:
    #include <unistd.h>
    #include <sys/wait.h>
    #include <stdio.h>
    
    int main() {
      int fd[2];
      pipe(fd); // 初始化管道
      if(fork() == 0) {
        // 子进程逻辑:关闭写端,读取父进程消息
        close(fd[1]);
        char buf[1024];
        int read_len = read(fd[0], buf, sizeof(buf)-1);
        buf[read_len] = '\0';
        printf("子进程收到消息:%s\n", buf);
        close(fd[0]);
        return 0;
      } else {
        // 父进程逻辑:关闭读端,向子进程发送消息
        close(fd[0]);
        char send_msg[] = "test message from parent";
        write(fd[1], send_msg, sizeof(send_msg));
        close(fd[1]);
        wait(NULL);
        return 0;
      }
    }
    
  • 无名Unix域套接字(socketpair):全双工通信方案,创建的一对套接字支持双向读写,不需要处理网络逻辑,支持SOCK_STREAM(流格式)或SOCK_DGRAM(数据报格式,自带消息边界,更适配消息传输需求),适合复杂双向交互场景。
  • 共享内存+同步原语:适合大容量数据传输场景,父子进程将同一块物理内存映射到各自虚拟地址空间,配合POSIX信号量sem_init、设置了PTHREAD_PROCESS_SHARED属性的互斥锁等同步机制避免读写竞态,传输效率最高。
  • 信号携带短消息:仅需传递少量控制信息时可使用,通过sigqueue发送信号的同时附带一个整型或指针值,无额外IO开销,但仅适合通知类、极小数据量的传输场景。
  • 临时文件配合同步机制:实现成本最低的落地方案,父子进程约定同一个临时文件路径,父进程写入完成后通过信号、文件锁等机制通知子进程读取,缺点是存在磁盘IO开销,仅适合性能要求不高的场景。

选型建议

简单单向消息传递优先选管道,实现成本最低;需要双向带消息边界的传输优先用socketpair创建SOCK_DGRAM类型的Unix域套接字;大体积数据传输优先选共享内存加同步原语的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:06:08