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
相关产品推荐
相关产品推荐

