sem_open sem_wait实现两个进程读写共享内存的同步的示例代码,包含非fork的进程1和进程2,两个信号量
时间: 2024-02-01 07:16:19 浏览: 123
下面是一个使用 `sem_open` 和 `sem_wait` 实现两个进程读写共享内存同步的示例代码。本代码包含两个信号量 `semaphore1` 和 `semaphore2`,其中 `semaphore1` 初始值为 1,`semaphore2` 初始值为 0。
进程 1:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <semaphore.h>
#define SHARED_MEM_SIZE 4096
#define SHARED_MEM_NAME "shared_memory"
#define SEMAPHORE1_NAME "semaphore1"
#define SEMAPHORE2_NAME "semaphore2"
int main()
{
int fd;
char *shared_mem_ptr;
sem_t *semaphore1, *semaphore2;
// 创建共享内存
fd = shm_open(SHARED_MEM_NAME, O_CREAT | O_RDWR, 0666);
if (fd == -1) {
perror("shm_open");
exit(1);
}
ftruncate(fd, SHARED_MEM_SIZE);
// 映射共享内存
shared_mem_ptr = mmap(NULL, SHARED_MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (shared_mem_ptr == MAP_FAILED) {
perror("mmap");
exit(1);
}
// 创建信号量1
semaphore1 = sem_open(SEMAPHORE1_NAME, O_CREAT, 0666, 1);
if (semaphore1 == SEM_FAILED) {
perror("sem_open");
exit(1);
}
// 创建信号量2
semaphore2 = sem_open(SEMAPHORE2_NAME, O_CREAT, 0666, 0);
if (semaphore2 == SEM_FAILED) {
perror("sem_open");
exit(1);
}
while (1) {
// 等待信号量1,准备写共享内存
sem_wait(semaphore1);
// 写共享内存
printf("进程1写入共享内存: ");
fgets(shared_mem_ptr, SHARED_MEM_SIZE, stdin);
// 发送信号量2,告诉进程2读取共享内存
sem_post(semaphore2);
}
// 关闭信号量1
sem_close(semaphore1);
sem_unlink(SEMAPHORE1_NAME);
// 关闭信号量2
sem_close(semaphore2);
sem_unlink(SEMAPHORE2_NAME);
// 解除映射共享内存
munmap(shared_mem_ptr, SHARED_MEM_SIZE);
close(fd);
shm_unlink(SHARED_MEM_NAME);
return 0;
}
```
进程 2:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <semaphore.h>
#define SHARED_MEM_SIZE 4096
#define SHARED_MEM_NAME "shared_memory"
#define SEMAPHORE1_NAME "semaphore1"
#define SEMAPHORE2_NAME "semaphore2"
int main()
{
int fd;
char *shared_mem_ptr;
sem_t *semaphore1, *semaphore2;
// 打开共享内存
fd = shm_open(SHARED_MEM_NAME, O_RDWR, 0666);
if (fd == -1) {
perror("shm_open");
exit(1);
}
// 映射共享内存
shared_mem_ptr = mmap(NULL, SHARED_MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (shared_mem_ptr == MAP_FAILED) {
perror("mmap");
exit(1);
}
// 打开信号量1
semaphore1 = sem_open(SEMAPHORE1_NAME, 0);
if (semaphore1 == SEM_FAILED) {
perror("sem_open");
exit(1);
}
// 打开信号量2
semaphore2 = sem_open(SEMAPHORE2_NAME, 0);
if (semaphore2 == SEM_FAILED) {
perror("sem_open");
exit(1);
}
while (1) {
// 等待信号量2,准备读取共享内存
sem_wait(semaphore2);
// 读取共享内存
printf("进程2读取共享内存: %s", shared_mem_ptr);
// 发送信号量1,告诉进程1可以继续写共享内存
sem_post(semaphore1);
}
// 关闭信号量1
sem_close(semaphore1);
// 关闭信号量2
sem_close(semaphore2);
// 解除映射共享内存
munmap(shared_mem_ptr, SHARED_MEM_SIZE);
close(fd);
return 0;
}
```
注意:由于本示例使用了 `shm_open` 和 `sem_open` 函数,因此需要链接 `-lrt` 库,例如:
```
gcc -o process1 process1.c -lrt
gcc -o process2 process2.c -lrt
```
阅读全文