在操作系统中,多个程序(或进程)往往需要协同工作。为了让它们能够交换数据、同步操作,就需要使用进程间通信(Inter-Process Communication, 简称 IPC)。本文将带你从零开始了解 C语言进程间通信 的两种基础方式:管道(Pipe)和共享内存(Shared Memory),即使你是编程小白也能轻松上手!

进程是操作系统分配资源的基本单位。每个进程拥有独立的地址空间,这意味着一个进程不能直接访问另一个进程的变量或内存。为了实现数据交换,操作系统提供了多种 IPC机制,常见的包括:
本文重点介绍最常用的两种:匿名管道 和 共享内存。
管道是一种半双工的通信方式,数据只能单向流动。通常用于具有亲缘关系的进程之间(如父子进程)。在 C 语言中,我们使用 pipe() 系统调用来创建管道。
#include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/wait.h>int main() { int fd[2]; // fd[0] 用于读,fd[1] 用于写 pid_t pid; char buffer[100]; // 创建管道 if (pipe(fd) == -1) { perror("pipe"); return 1; } pid = fork(); if (pid == 0) { // 子进程:从管道读取数据 close(fd[1]); // 关闭写端 read(fd[0], buffer, sizeof(buffer)); printf("子进程收到:%s\n", buffer); close(fd[0]); } else if (pid > 0) { // 父进程:向管道写入数据 close(fd[0]); // 关闭读端 const char *msg = "Hello from parent!"; write(fd[1], msg, strlen(msg) + 1); close(fd[1]); wait(NULL); // 等待子进程结束 } else { perror("fork"); return 1; } return 0;}运行这段代码,你会看到子进程成功接收到来自父进程的消息。注意:使用完管道后要记得关闭不用的文件描述符,避免资源泄漏。
共享内存 是最快的 IPC 方式,因为它允许多个进程直接访问同一块物理内存区域。不过,由于没有内置同步机制,通常需要配合信号量等工具来避免竞争条件。
#include <stdio.h>#include <sys/ipc.h>#include <sys/shm.h>#include <unistd.h>#include <string.h>int main() { key_t key = ftok("shmfile", 65); // 生成唯一 key int shmid = shmget(key, 1024, 0666 | IPC_CREAT); // 创建共享内存段 char *str = (char*) shmat(shmid, NULL, 0); // 将共享内存连接到当前进程 pid_t pid = fork(); if (pid == 0) { // 子进程:读取共享内存 sleep(1); // 确保父进程先写入 printf("子进程读取:%s\n", str); shmdt(str); // 断开连接 } else if (pid > 0) { // 父进程:写入共享内存 strcpy(str, "Data from shared memory!"); printf("父进程写入完成。\n"); shmdt(str); wait(NULL); // 清理:删除共享内存 shmctl(shmid, IPC_RMID, NULL); } return 0;}这个例子中,父进程将字符串写入共享内存,子进程稍后读取。注意使用 shmctl(..., IPC_RMID, ...) 在程序结束前清理共享内存,否则它会一直存在于系统中。
通过本教程,你已经掌握了 C 语言中两种基础的 进程间通信 方法:
无论是开发多进程服务器、并行计算程序,还是理解操作系统原理,掌握这些 IPC机制 都是必不可少的技能。建议你在 Linux 环境下亲手编译运行上述代码,加深理解!
提示:编译时请使用 gcc,并确保在类 Unix 系统(如 Linux 或 macOS)上运行。
本文由主机测评网于2025-12-11发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126223.html