两个进程通信采用共享内存收发数据 结合信号量处理 使用C语言编写试例代码
时间: 2024-09-14 15:03:27 浏览: 37
两个进程通过共享内存通信是一种效率较高的进程间通信方法,因为它允许两个进程直接读写同一块内存空间,而无需数据在内核空间和用户空间之间进行复制。信号量则用于同步和互斥访问共享内存。以下是一个简单的例子,展示了如何使用C语言在Linux环境下通过共享内存和信号量进行两个进程间的通信。
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <semaphore.h>
#define SEM_NAME "/sem_example"
#define SHM_NAME "/shm_example"
#define SHM_SIZE 1024
int main() {
// 创建或打开信号量
sem_t *sem = sem_open(SEM_NAME, O_CREAT, 0666, 1);
if (sem == SEM_FAILED) {
perror("sem_open");
exit(EXIT_FAILURE);
}
// 创建或打开共享内存对象
int shm_fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666);
if (shm_fd == -1) {
perror("shm_open");
sem_close(sem);
sem_unlink(SEM_NAME);
exit(EXIT_FAILURE);
}
// 设置共享内存大小
ftruncate(shm_fd, SHM_SIZE);
// 映射共享内存到进程地址空间
char *shm_ptr = (char*)mmap(0, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
if (shm_ptr == MAP_FAILED) {
perror("mmap");
shm_unlink(SHM_NAME);
sem_close(sem);
sem_unlink(SEM_NAME);
exit(EXIT_FAILURE);
}
// 生产者进程(写入数据到共享内存)
sem_wait(sem); // 等待信号量
sprintf(shm_ptr, "Hello, World!");
sem_post(sem); // 释放信号量
sleep(2); // 模拟数据处理
// 消费者进程(从共享内存读取数据)
sem_wait(sem); // 等待信号量
printf("Read: %s\n", shm_ptr);
sem_post(sem); // 释放信号量
// 清理资源
munmap(shm_ptr, SHM_SIZE);
sem_close(sem);
sem_unlink(SEM_NAME);
shm_unlink(SHM_NAME);
return 0;
}
```
这段代码包含了两个部分:生产者和消费者。生产者将字符串"Hello, World!"写入共享内存,然后消费者从共享内存中读取并打印这个字符串。两个进程通过信号量进行同步,确保在消费者读取数据之前生产者已经写入数据,并且在生产者再次写入之前消费者已经读取数据。
阅读全文