semop实现两个进程读写共享内存,使用信号量同步
时间: 2023-07-11 15:08:51 浏览: 58
semop是一个系统调用,它可以用于实现进程间的同步和互斥。在使用共享内存进行进程间通信时,需要使用信号量来实现同步和互斥。
下面是一个使用semop实现两个进程读写共享内存的示例:
首先,我们需要创建一个共享内存区域,以及两个信号量,一个用于互斥,一个用于同步:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
int main()
{
int shmid, semid;
char *shmaddr;
struct sembuf semop;
key_t key;
// 创建共享内存
key = ftok("/tmp/mem", 1);
shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666);
if (shmid == -1) {
perror("shmget");
exit(1);
}
// 映射共享内存
shmaddr = shmat(shmid, NULL, 0);
if (shmaddr == (char *)-1) {
perror("shmat");
exit(1);
}
// 创建两个信号量,一个用于互斥,一个用于同步
semid = semget(key, 2, IPC_CREAT | 0666);
if (semid == -1) {
perror("semget");
exit(1);
}
// 初始化信号量
semctl(semid, 0, SETVAL, 1); // 互斥信号量初始值为1
semctl(semid, 1, SETVAL, 0); // 同步信号量初始值为0
// 进程1写入数据
semop.sem_num = 0;
semop.sem_op = -1; // 互斥信号量减1,获取锁
semop.sem_flg = SEM_UNDO;
semop(semid, &semop, 1);
memcpy(shmaddr, "hello world", 12);
semop.sem_num = 1;
semop.sem_op = 1; // 同步信号量加1,通知进程2
semop.sem_flg = SEM_UNDO;
semop(semid, &semop, 1);
// 进程2读取数据
semop.sem_num = 1;
semop.sem_op = -1; // 等待进程1写入数据
semop.sem_flg = SEM_UNDO;
semop(semid, &semop, 1);
printf("%s\n", shmaddr);
semop.sem_num = 0;
semop.sem_op = 1; // 释放互斥锁
semop.sem_flg = SEM_UNDO;
semop(semid, &semop, 1);
// 删除共享内存和信号量
shmdt(shmaddr);
shmctl(shmid, IPC_RMID, NULL);
semctl(semid, 0, IPC_RMID, 0);
return 0;
}
```
上述代码中,进程1先获取互斥信号量的锁,然后向共享内存中写入数据,并且通知进程2可以读取数据了。进程2会在同步信号量上等待,直到进程1写入数据后通知它,然后读取共享内存中的数据,并释放互斥信号量的锁。
需要注意的是,semop函数的第三个参数应该是操作信号量的个数,而不是信号量的编号。在本例中,我们只操作了一个信号量,所以第三个参数的值为1。