sem_open sem_wait实现两个进程读写共享内存的同步的示例代码,包含进程1和进程2,两个信号量
时间: 2024-02-01 16:16:09 浏览: 102
下面是一个基于 POSIX 信号量的示例代码,实现了两个进程读写共享内存的同步。其中,进程1向共享内存中写入数据,进程2从共享内存中读取数据。
```c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <semaphore.h>
#define SHM_SIZE 1024
int main() {
int shm_fd;
char *shm_ptr;
sem_t *sem1, *sem2;
sem1 = sem_open("/sem1", O_CREAT, 0666, 1); // 初始化为 1
sem2 = sem_open("/sem2", O_CREAT, 0666, 0); // 初始化为 0
shm_fd = shm_open("/shm", O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, SHM_SIZE);
shm_ptr = (char *) mmap(NULL, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
if (fork() == 0) { // 进程1
sem_wait(sem1); // 等待 sem1 可用
sprintf(shm_ptr, "Hello, world!"); // 写入数据
sem_post(sem2); // 发送 sem2,通知进程2 数据已经写入
exit(0);
} else { // 进程2
sem_wait(sem2); // 等待 sem2 可用
printf("Received message: %s\n", shm_ptr); // 读取数据
sem_post(sem1); // 发送 sem1,通知进程1 已经读取数据
exit(0);
}
}
```
上述代码中,进程1等待 sem1 可用后,向共享内存中写入数据,并发送 sem2。进程2在接收到 sem2 后,从共享内存中读取数据,并发送 sem1。通过这种方式,进程1和进程2能够同步读写共享内存。
阅读全文