sem_open sem_wait实现两个进程读写共享内存的同步,包括两个进程,两个信号量,一个循环
时间: 2023-12-01 16:02:26 浏览: 97
共享内存,进程通信,进程同步 代码
4星 · 用户满意度95%
下面是一个使用 `sem_open` 和 `sem_wait` 实现两个进程读写共享内存的同步的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <semaphore.h>
#define SHM_SIZE 1024
int main() {
int fd;
char *shm_ptr;
sem_t *sem1, *sem2;
// 创建共享内存
fd = shm_open("/my_shm", O_CREAT | O_RDWR, 0666);
ftruncate(fd, SHM_SIZE);
shm_ptr = mmap(NULL, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
// 创建两个信号量
sem1 = sem_open("/my_sem1", O_CREAT, 0666, 0);
sem2 = sem_open("/my_sem2", O_CREAT, 0666, 1);
pid_t pid = fork();
if (pid == 0) { // 子进程
for (int i = 0; i < 10; i++) {
sem_wait(sem1); // 等待读信号量
printf("子进程读取数据:%s\n", shm_ptr);
sem_post(sem2); // 发送写信号量
}
} else { // 父进程
for (int i = 0; i < 10; i++) {
sem_wait(sem2); // 等待写信号量
sprintf(shm_ptr, "第%d条数据", i);
printf("父进程写入数据:%s\n", shm_ptr);
sem_post(sem1); // 发送读信号量
}
wait(NULL);
}
// 关闭并删除信号量和共享内存
sem_close(sem1);
sem_close(sem2);
sem_unlink("/my_sem1");
sem_unlink("/my_sem2");
munmap(shm_ptr, SHM_SIZE);
shm_unlink("/my_shm");
return 0;
}
```
上述代码创建了一个大小为 `SHM_SIZE` 的共享内存和两个信号量。子进程通过等待读信号量 `sem1` 来同步读操作,父进程通过等待写信号量 `sem2` 来同步写操作。在每次读写操作完成后,进程都会发送相应的信号量以便另一个进程可以进行下一步操作。最后,进程关闭并删除信号量和共享内存。
阅读全文