【linux】进程间通信(IPC)——匿名管道,命名管道与System V内核方案的共享内存,以及消息队列和信号量的原理概述
    		       		warning:
    		            这篇文章距离上次修改已过442天,其中的内容可能已经有所变动。
    		        
        		                
                在Linux中,进程间通信(IPC)主要有以下几种方式:
- 匿名管道(Pipe):提供一条管道,用于进程间的单向数据传输。
- 命名管道(Named Pipe):类似于匿名管道,但可以在系统中命名,允许无关进程间通信。
- System V 共享内存区方案:允许多个进程共享一块内存区域,是最快的IPC方式。
以下是使用这些方式的示例代码:
匿名管道:
#include <unistd.h>
 
int main() {
    int fd[2];
    if (pipe(fd) == -1) {
        return -1;
    }
 
    if (fork() == 0) {
        // 子进程写入
        close(fd[0]);
        write(fd[1], "Hello, Pipe!", 13);
        close(fd[1]);
    } else {
        // 父进程读取
        close(fd[1]);
        char buffer[20];
        read(fd[0], buffer, 20);
        printf("Received: %s\n", buffer);
        close(fd[0]);
    }
 
    return 0;
}命名管道:
# 创建命名管道
mkfifo mypipe
 
# 一个进程写入
echo "Hello, Named Pipe!" > mypipe
 
# 另一个进程读取
cat < mypipeSystem V 共享内存区方案:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
 
int main() {
    int shm_id;
    char* shm_addr;
 
    // 创建共享内存
    shm_id = shmget(IPC_PRIVATE, 1024, 0666);
 
    // 连接共享内存
    shm_addr = shmat(shm_id, NULL, 0);
 
    if (fork() == 0) {
        // 子进程写入
        sprintf(shm_addr, "Hello, Shared Memory!");
    } else {
        // 父进程等待子进程写入后读取
        wait(NULL);
        printf("Received: %s\n", (char*)shm_addr);
    }
 
    // 断开共享内存
    shmdt(shm_addr);
 
    // 删除共享内存
    shmctl(shm_id, IPC_RMID, NULL);
 
    return 0;
}这些代码提供了进程间通信的基本概念和示例。在实际应用中,你需要根据具体需求来选择合适的IPC方式,并处理好并发和同步等问题。
评论已关闭