c语言循环共享内存读写的时候加上信号量代码
时间: 2023-08-12 15:25:21 浏览: 95
以下是使用 POSIX 信号量的 C 语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <semaphore.h>
#define SHM_SIZE 1024
int main()
{
int shm_fd;
char *shm_ptr;
sem_t *sem_ptr;
// 打开共享内存
shm_fd = shm_open("/myshm", O_RDWR | O_CREAT, 0666);
if (shm_fd == -1) {
perror("shm_open failed");
return 1;
}
// 设置共享内存大小
if (ftruncate(shm_fd, SHM_SIZE) == -1) {
perror("ftruncate failed");
return 1;
}
// 映射共享内存到进程地址空间
shm_ptr = mmap(NULL, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
if (shm_ptr == MAP_FAILED) {
perror("mmap failed");
return 1;
}
// 创建信号量
sem_ptr = sem_open("/mysem", O_CREAT, 0666, 1);
if (sem_ptr == SEM_FAILED) {
perror("sem_open failed");
return 1;
}
// 循环读写共享内存
for (int i = 0; i < 10; i++) {
// 加锁
if (sem_wait(sem_ptr) == -1) {
perror("sem_wait failed");
return 1;
}
// 写入数据
snprintf(shm_ptr, SHM_SIZE, "Hello, world! %d", i);
// 解锁
if (sem_post(sem_ptr) == -1) {
perror("sem_post failed");
return 1;
}
// 加锁
if (sem_wait(sem_ptr) == -1) {
perror("sem_wait failed");
return 1;
}
// 读取数据
printf("shm_ptr = %s\n", shm_ptr);
// 解锁
if (sem_post(sem_ptr) == -1) {
perror("sem_post failed");
return 1;
}
// 等待 1 秒
sleep(1);
}
// 关闭共享内存
if (munmap(shm_ptr, SHM_SIZE) == -1) {
perror("munmap failed");
return 1;
}
if (shm_unlink("/myshm") == -1) {
perror("shm_unlink failed");
return 1;
}
// 关闭信号量
if (sem_close(sem_ptr) == -1) {
perror("sem_close failed");
return 1;
}
if (sem_unlink("/mysem") == -1) {
perror("sem_unlink failed");
return 1;
}
return 0;
}
```
这个示例程序创建了一个大小为 1024 字节的共享内存区域和一个名为 "/mysem" 的信号量,然后在一个循环中往共享内存中写入数据,并从共享内存中读取数据。在写入和读取共享内存之前,分别使用 `sem_wait()` 和 `sem_post()` 函数对信号量进行加锁和解锁,以确保多个进程或线程之间的同步和互斥。
阅读全文