几种 IPC 方式

博客内容为烂笔头(2)的总结,但未给出具体总结信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

烂笔头(2):总结
这里写图片描述

### 三、IPC进程间通信的几种方式 #### 1. **管道(Pipe)** - 管道是一种半双工的通信机制,允许数据在一个方向上传输。 - 它通常用于具有亲缘关系的进程之间,例如父子进程。 - 创建管道后,父进程可以将文件描述符传递给子进程,从而实现两者之间的通信[^1]。 ```bash int pipefd[2]; if (pipe(pipefd) == -1) { perror("Pipe failed"); } ``` #### 2. **命名管道(FIFO)** - 命名管道与匿名管道类似,但它是一个存在于文件系统的特殊文件。 - 不同之处在于命名管道可以在无血缘关系的进程间使用。 - 这种方式提供了更大的灵活性,因为任何能够访问该文件的进程都可以参与通信[^3]。 ```bash mkfifo my_fifo, 0666; int fd = open("my_fifo", O_WRONLY); write(fd, "Hello via FIFO", 14); close(fd); ``` #### 3. **消息队列(Message Queue)** - 消息队列提供了一种更为高级的消息传递机制。 - 它允许多个进程向同一个队列发送和接收消息,而不必担心同步问题。 - 每条消息都有一个类型字段,这使得接收者可以选择性地获取特定类型的 message[^3]。 ```c #include <sys/msg.h> key_t key = ftok("/tmp", 'a'); int msgid = msgget(key, 0666 | IPC_CREAT); struct msgbuf { long mtype; /* Message type */ char mtext[BUFSIZ];/* Message content */ }; ``` #### 4. **共享内存(Shared Memory)** - 共享内存是最高效的进程间通信方式之一。 - 它让多个进程可以直接访问同一块内存区域,减少了不必要的数据复制开销。 - 尽管速度快,但需要额外的手段来协调对共享资源的竞争条件,比如信号量[^2]。 ```c key_t key = ftok("/tmp", 'b'); int shmid = shmget(key, sizeof(some_data_structure), 0666|IPC_CREAT); some_data_structure *data_ptr = shmat(shmid, NULL, 0); ``` #### 5. **信号(Signal)** - 信号是一种简单的通知机制,用来告知某个事件的发生。 - 当一个信号被发送到目标进程中时,它会中断当前正在执行的操作并转而去处理相应的信号处理器函数。 - 此外,由于其轻量化特性,也经常作为触发某些动作的一种快捷途径。 ```c void handler(int sig){ printf("Caught signal %d\n", sig); } signal(SIGINT, handler); pause(); // Wait for signals. ``` #### 6. **套接字(Socket)** - 套接字不仅限于网络编程领域,在本地机器上的不同进程也可以利用它们来进行交流互动。 - 对比前面提到的一些传统ipc 方法而言,socket api 更加统一且功能强大,支持多种协议栈以及复杂的连接状态管理。 ```python import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("localhost", port)) s.sendall(b'Hello world') response = s.recv(1024) ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值