Linux IPC(进程间通信)机制是Linux操作系统中用于进程间通信的一组方法和工具。其中包括三种主要的IPC机制:消息队列、信号量和共享内存。下面是每种IPC机制的简要介绍:
1. 消息队列:消息队列是一种进程间通信机制,它允许一个或多个进程向队列中添加消息,并允许其他进程从队列中读取消息。消息队列通常用于在不同进程之间传递数据,例如在客户端和服务器之间传递请求和响应数据。
2. 信号量:信号量是一种用于进程同步和互斥的机制。它允许多个进程共享一个资源,并确保每个进程都能够安全地访问该资源。信号量通常用于控制对共享资源的访问,例如在多个进程之间共享打印机或磁盘驱动器。
3. 共享内存:共享内存是一种允许多个进程共享同一块物理内存的机制。这种机制通常比其他IPC机制更快,因为它避免了数据复制的开销。共享内存通常用于在多个进程之间共享大量数据,例如在图像处理或数据库应用程序中。
下面是每种IPC机制的一个简单示例:
1. 消息队列:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSG_SIZE 1024
struct msg_buffer {
long msg_type;
char msg_text[MSG_SIZE];
} message;
int main() {
key_t key;
int msg_id;
// 创建消息队列
key = ftok("progfile", 65);
msg_id = msgget(key, 0666 | IPC_CREAT);
// 发送消息
message.msg_type = 1;
strcpy(message.msg_text, "Hello World!");
msgsnd(msg_id, &message, sizeof(message), 0);
// 接收消息
msgrcv(msg_id, &message, sizeof(message), 1, 0);
printf("Received message: %s\n", message.msg_text);
// 删除消息队列
msgctl(msg_id, IPC_RMID, NULL);
return 0;
}
```
2. 信号量:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int main() {
key_t key;
int sem_id;
struct sembuf sem_op;
// 创建信号量
key = ftok("progfile", 66);
sem_id = semget(key, 1, 0666 | IPC_CREAT);
// 初始化信号量
semctl(sem_id, 0, SETVAL, 1);
// 进程同步
sem_op.sem_num = 0;
sem_op.sem_op = -1;
sem_op.sem_flg = 0;
semop(sem_id, &sem_op, 1);
printf("Critical section\n");
sleep(5);
sem_op.sem_num = 0;
sem_op.sem_op = 1;
sem_op.sem_flg = 0;
semop(sem_id, &sem_op, 1);
// 删除信号量
semctl(sem_id, 0, IPC_RMID);
return 0;
}
```
3. 共享内存:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
int main() {
key_t key;
int shm_id;
char *shm_addr;
// 创建共享内存
key = ftok("progfile", 67);
shm_id = shmget(key, SHM_SIZE, 0666 | IPC_CREAT);
// 连接共享内存
shm_addr = shmat(shm_id, NULL, 0);
// 写入共享内存
strcpy(shm_addr, "Hello World!");
// 从共享内存中读取数据
printf("Shared memory data: %s\n", shm_addr);
// 分离共享内存
shmdt(shm_addr);
// 删除共享内存
shmctl(shm_id, IPC_RMID, NULL);
return 0;
}
```