使用semop在两个非fork进程中实现共享内存读写的同步
时间: 2024-02-01 16:13:41 浏览: 91
两进程间共享内存通讯
5星 · 资源好评率100%
在两个非fork进程中实现共享内存读写的同步,可以使用信号量(semaphore)来实现。信号量是一种进程间通信机制,用于实现进程的同步与互斥。
下面是一个使用semop实现共享内存读写同步的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
};
int main() {
int shmid, semid;
char *shmaddr;
union semun sem_union;
struct sembuf sem_op;
// 创建共享内存
shmid = shmget(IPC_PRIVATE, 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(IPC_PRIVATE, 1, IPC_CREAT | 0666);
if (semid == -1) {
perror("semget error");
exit(EXIT_FAILURE);
}
// 初始化信号量
sem_union.val = 0;
if (semctl(semid, 0, SETVAL, sem_union) == -1) {
perror("semctl error");
exit(EXIT_FAILURE);
}
// 写入共享内存
sem_op.sem_num = 0;
sem_op.sem_flg = 0;
sem_op.sem_op = -1; // P操作
if (semop(semid, &sem_op, 1) == -1) {
perror("semop error");
exit(EXIT_FAILURE);
}
printf("Enter a message: ");
fgets(shmaddr, SHM_SIZE, stdin);
sem_op.sem_num = 0;
sem_op.sem_flg = 0;
sem_op.sem_op = 1; // V操作
if (semop(semid, &sem_op, 1) == -1) {
perror("semop error");
exit(EXIT_FAILURE);
}
// 读取共享内存
sem_op.sem_num = 0;
sem_op.sem_flg = 0;
sem_op.sem_op = -1; // P操作
if (semop(semid, &sem_op, 1) == -1) {
perror("semop error");
exit(EXIT_FAILURE);
}
printf("Received message: %s", shmaddr);
sem_op.sem_num = 0;
sem_op.sem_flg = 0;
sem_op.sem_op = 1; // V操作
if (semop(semid, &sem_op, 1) == -1) {
perror("semop error");
exit(EXIT_FAILURE);
}
// 删除信号量和共享内存
if (semctl(semid, 0, IPC_RMID, sem_union) == -1) {
perror("semctl error");
exit(EXIT_FAILURE);
}
if (shmdt(shmaddr) == -1) {
perror("shmdt error");
exit(EXIT_FAILURE);
}
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl error");
exit(EXIT_FAILURE);
}
return 0;
}
```
在上面的示例代码中,我们先创建了一个共享内存和一个信号量。然后,在写入共享内存前,我们使用了P操作来获取信号量,以确保共享内存可写。接下来,我们从标准输入中读取一行内容,并将其写入共享内存。完成后,我们使用V操作释放信号量,以确保其他进程可以读取共享内存。
读取共享内存的方式类似,我们先使用P操作获取信号量,然后读取共享内存中的内容,最后使用V操作释放信号量,以确保其他进程可以继续写入共享内存。最后,我们删除了信号量和共享内存。
需要注意的是,上面的示例代码中只使用了一个信号量,因此只能保证单个进程的读写同步。如果有多个进程需要读写共享内存,需要使用多个信号量来实现不同进程之间的同步。
阅读全文