sem = sem_open("/mysem", O_CREAT, 0666, 1);并向共享内存内写入结构体
时间: 2024-05-12 16:13:18 浏览: 108
共享内存的属性结构体
好的,可以参考以下代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
#define SHM_SIZE 1024
typedef struct {
char name[20];
int age;
} person;
int main() {
sem_t *sem;
int fd;
person *p;
// 创建信号量
sem = sem_open("/mysem", O_CREAT, 0666, 1);
if (sem == SEM_FAILED) {
perror("sem_open");
exit(EXIT_FAILURE);
}
// 创建共享内存
fd = shm_open("/myshm", O_CREAT | O_RDWR, 0666);
if (fd == -1) {
perror("shm_open");
exit(EXIT_FAILURE);
}
// 调整共享内存大小
if (ftruncate(fd, SHM_SIZE) == -1) {
perror("ftruncate");
exit(EXIT_FAILURE);
}
// 映射共享内存
p = mmap(NULL, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (p == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
// 写入结构体
sem_wait(sem); // P操作
strncpy(p->name, "Tom", 20);
p->age = 18;
sem_post(sem); // V操作
// 关闭信号量和共享内存
sem_close(sem);
munmap(p, SHM_SIZE);
close(fd);
return 0;
}
```
这段程序首先创建了一个信号量 `/mysem`,然后创建了一个大小为 `SHM_SIZE` 的共享内存 `/myshm`,并将其映射到进程的地址空间中。之后,程序使用 `sem_wait` 和 `sem_post` 对信号量进行 P 操作和 V 操作,并在共享内存中写入了一个结构体。最后,程序关闭了信号量和共享内存。
需要注意的是,如果其他进程也需要访问同一个共享内存,它们需要使用相同的信号量来进行同步。否则,就会出现多个进程同时访问共享内存的情况,导致数据不一致。
阅读全文