插件窝 干货文章 Linux进程间通信怎么实现

Linux进程间通信怎么实现

进程 机制 特点 实现 1010    来源:    2025-04-22

Linux 提供了多种进程间通信(IPC, Inter-Process Communication)机制,每种机制适用于不同场景。以下是主要的 IPC 方式及其实现方法:


1. 管道(Pipe)

  • 特点:单向通信,血缘关系进程间使用(如父子进程)
  • 实现

    int fd[2];
    pipe(fd);  // fd[0]读端, fd[1]写端
    
    if (fork() == 0) {  // 子进程
      close(fd[0]);
      write(fd[1], "Hello", 6);
    } else {            // 父进程
      close(fd[1]);
      char buf[10];
      read(fd[0], buf, sizeof(buf));
    }
    

2. 命名管道(FIFO)

  • 特点:通过文件系统实现,无血缘关系进程也可通信
  • 实现

    # 创建FIFO文件
    mkfifo /tmp/myfifo
    
    // 进程A(写)
    int fd = open("/tmp/myfifo", O_WRONLY);
    write(fd, "Data", 5);
    
    // 进程B(读)
    int fd = open("/tmp/myfifo", O_RDONLY);
    read(fd, buf, sizeof(buf));
    

3. 共享内存(Shared Memory)

  • 特点:最高效的IPC方式,需同步机制配合
  • 实现步骤
    1. 创建共享内存段 shmget()
    2. 附加到进程空间 shmat()
    3. 使用后分离 shmdt()
    4. 删除 shmctl()

4. 消息队列(Message Queue)

  • 特点:结构化数据交换,内核持久化
  • 关键函数
    • msgget() 创建/获取队列
    • msgsnd() 发送消息
    • msgrcv() 接收消息

5. 信号量(Semaphore)

  • 作用:进程间同步,控制资源访问
  • System V信号量示例c semget(key, 1, IPC_CREAT|0666); // 创建 semop(semid, &sembuf, 1); // P/V操作

6. 信号(Signal)

  • 特点:异步通知机制(如 SIGINTSIGUSR1
  • 示例c signal(SIGUSR1, handler); // 注册信号处理函数 kill(pid, SIGUSR1); // 发送信号

7. 套接字(Socket)

  • 特点:跨网络通信,支持不同主机
  • 本地套接字示例

    sockaddr_un addr;
    addr.sun_family = AF_UNIX;
    strcpy(addr.sun_path, "/tmp/mysock");
    
    bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
    

8. 内存映射文件(mmap)

  • 特点:将文件映射到内存,实现进程间共享
  • 实现c void *addr = mmap(NULL, length, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

选择建议

机制 适用场景 速度 复杂度
管道 父子进程简单通信
共享内存 大数据量高频通信 最快
消息队列 结构化消息传递
Socket 跨网络或复杂通信

注意事项

  1. 共享内存和消息队列需注意 IPC资源泄漏(用 ipcs 查看,ipcrm 删除)
  2. 多进程访问共享资源时 必须使用同步机制(如信号量)
  3. 考虑使用更现代的替代方案:
    • POSIX IPC(如 mq_open()sem_open()
    • 基于文件的锁(fcntl()

需要具体代码示例或更深入解释某个机制可以告诉我!