使用sem_wait在两个独立的进程中实现共享内存读写的同步
时间: 2024-02-01 07:14:46 浏览: 95
通过共享内存实现多进程间的通信,共享数据
5星 · 资源好评率100%
要在两个独立的进程中实现共享内存读写的同步,可以使用信号量来控制临界区的访问。下面是一个使用sem_wait和sem_post实现共享内存读写同步的示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHM_SIZE 1024
int main()
{
key_t key = ftok(".", 's'); // 生成共享内存和信号量的key
int shmid, semid;
char *shmaddr;
struct sembuf sem_p, sem_v;
// 创建共享内存
shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666);
if (shmid == -1) {
perror("shmget error");
exit(EXIT_FAILURE);
}
// 映射共享内存
shmaddr = shmat(shmid, NULL, 0);
if (shmaddr == (char *)-1) {
perror("shmat error");
exit(EXIT_FAILURE);
}
// 创建信号量
semid = semget(key, 1, IPC_CREAT | 0666);
if (semid == -1) {
perror("semget error");
exit(EXIT_FAILURE);
}
// 初始化信号量
semctl(semid, 0, SETVAL, 1);
// 写入共享内存
sem_p.sem_num = 0;
sem_p.sem_op = -1;
sem_p.sem_flg = SEM_UNDO;
semop(semid, &sem_p, 1);
sprintf(shmaddr, "Hello, world!");
sem_v.sem_num = 0;
sem_v.sem_op = 1;
sem_v.sem_flg = SEM_UNDO;
semop(semid, &sem_v, 1);
// 读取共享内存
sem_p.sem_num = 0;
sem_p.sem_op = -1;
sem_p.sem_flg = SEM_UNDO;
semop(semid, &sem_p, 1);
printf("%s\n", shmaddr);
sem_v.sem_num = 0;
sem_v.sem_op = 1;
sem_v.sem_flg = SEM_UNDO;
semop(semid, &sem_v, 1);
// 删除共享内存和信号量
shmdt(shmaddr);
shmctl(shmid, IPC_RMID, NULL);
semctl(semid, 0, IPC_RMID, 0);
return 0;
}
```
在这个示例中,我们首先使用ftok函数生成共享内存和信号量的key,然后使用shmget创建共享内存,shmat将共享内存映射到进程地址空间中,semget创建信号量。我们使用semctl初始化信号量,将其初始值设置为1。
接下来,我们使用sem_p和sem_v两个结构体来分别定义P操作和V操作,然后使用semop函数对信号量进行操作,以控制进入临界区的进程数量。
在写入共享内存时,我们首先执行P操作,将信号量的值减1,表示进入了临界区。然后写入数据到共享内存中,最后执行V操作,将信号量的值加1,表示离开了临界区。
在读取共享内存时,我们首先执行P操作,将信号量的值减1,表示进入了临界区。然后读取共享内存中的数据,最后执行V操作,将信号量的值加1,表示离开了临界区。
最后我们使用shmdt和shmctl函数删除共享内存,semctl函数删除信号量。
阅读全文