semop实现两个进程读写共享内存的同步的示例代码,包含进程1和进程2,两个信号量
时间: 2023-11-28 21:04:39 浏览: 91
使用共享内存及信号量实现进程间通信例子
下面是一个示例代码,其中包含进程1和进程2,以及两个信号量。
进程1:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHM_SIZE 1024
// 定义信号量的操作
struct sembuf sem_read = {0, -1, SEM_UNDO};
struct sembuf sem_write = {1, -1, SEM_UNDO};
struct sembuf sem_unlock = {0, 1, SEM_UNDO};
int main()
{
// 创建共享内存
key_t key = ftok("/tmp", 'a');
int shm_id = shmget(key, SHM_SIZE, IPC_CREAT | 0666);
if (shm_id == -1) {
perror("shmget");
exit(EXIT_FAILURE);
}
// 创建两个信号量
int sem_id = semget(key, 2, IPC_CREAT | 0666);
if (sem_id == -1) {
perror("semget");
exit(EXIT_FAILURE);
}
// 初始化信号量
semctl(sem_id, 0, SETVAL, 0); // 读信号量初始化为0
semctl(sem_id, 1, SETVAL, 1); // 写信号量初始化为1
// 连接共享内存
char *shm_ptr = (char *)shmat(shm_id, NULL, 0);
if (shm_ptr == (char *)-1) {
perror("shmat");
exit(EXIT_FAILURE);
}
// 写入共享内存
printf("Process 1 is writing to shared memory...\n");
semop(sem_id, &sem_write, 1); // 等待写信号量
sprintf(shm_ptr, "Hello, World!");
semop(sem_id, &sem_unlock, 1); // 发出读信号量
// 等待进程2读取共享内存
semop(sem_id, &sem_read, 1);
// 断开共享内存连接
shmdt(shm_ptr);
return 0;
}
```
进程2:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHM_SIZE 1024
// 定义信号量的操作
struct sembuf sem_read = {0, -1, SEM_UNDO};
struct sembuf sem_write = {1, -1, SEM_UNDO};
struct sembuf sem_unlock = {1, 1, SEM_UNDO};
int main()
{
// 创建共享内存
key_t key = ftok("/tmp", 'a');
int shm_id = shmget(key, SHM_SIZE, IPC_CREAT | 0666);
if (shm_id == -1) {
perror("shmget");
exit(EXIT_FAILURE);
}
// 创建两个信号量
int sem_id = semget(key, 2, IPC_CREAT | 0666);
if (sem_id == -1) {
perror("semget");
exit(EXIT_FAILURE);
}
// 连接共享内存
char *shm_ptr = (char *)shmat(shm_id, NULL, 0);
if (shm_ptr == (char *)-1) {
perror("shmat");
exit(EXIT_FAILURE);
}
// 读取共享内存
semop(sem_id, &sem_read, 1); // 等待读信号量
printf("Process 2 reads from shared memory: %s\n", shm_ptr);
semop(sem_id, &sem_unlock, 1); // 发出写信号量
// 断开共享内存连接
shmdt(shm_ptr);
// 删除共享内存和信号量
shmctl(shm_id, IPC_RMID, NULL);
semctl(sem_id, 0, IPC_RMID);
semctl(sem_id, 1, IPC_RMID);
return 0;
}
```
这个示例代码使用了两个信号量来实现同步。进程1先等待写信号量,然后向共享内存中写入数据,并发出读信号量。进程2先等待读信号量,然后从共享内存中读取数据,并发出写信号量。这样就保证了两个进程在操作共享内存时的同步。
阅读全文