共享内存初始化和访问
Shared Memory initialise and access
我正在编写一个使用共享内存的客户端-服务器程序。我创建了一个shm.c和shm.h,以使客户端和服务器文件更好。但是,我想知道如何在下面的代码中使用accessSHM初始化共享内存(缺少,因为我不知道如果有人可以解释这一点,我将如何访问它,这将非常有帮助(。
#include <stdbool.h>
#include <time.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "shm.h"
char * getTimeStamp() {
time_t ltime = time(NULL);
return strtok(ctime(<ime), "n");
}
int createSHM(char * shname)
{
if ((shmid = shmget(key, sizeof(msg), IPC_CREAT)) < 0) {
perror("shmget");
exit(1);
}
} int loadSHM(char * shname( {
if (shname< 0)
{
printf("shmget errorn");
exit(1);
}
}
SHMstruct * accessSHM(int fd) {
}
SHMstruct * initSHM(int fd, SHMstruct *data) {
}
void clearSHM(SHMstruct * shm)
{
int status = munmap(shm, sizeof(SHMstruct));
if (status ==-1){
fprintf(stderr, "Failure in clearSHM",strerror(errno));
exit(errno);
}
}
void closeSHM(int fd)
{
int status = close(fd);
if (status ==-1){
fprintf(stderr, "Failure in closeSHM",strerror(errno));
exit(errno);
}
}
void destroySHM(char * shname)
{
int status = shm_unlink (shname);
if (status ==-1){
fprintf(stderr, "Failure in destroySHM",strerror(errno));
exit(errno);
}
}
嘘声
#ifndef _shm_h_
#define _shm_h_
#include <stdbool.h>
#define SHNAME "/shmserver" // shared memory
#define MAX_TICKETS 10
#define MAX_SLEEP 1 // seconds
typedef struct SHM {
int ticket;
bool isTaken;
bool soldOut;
} SHMstruct;
extern char * getTimeStamp();
extern int createSHM(char *shname);
extern int loadSHM( char *shname);
extern SHMstruct* initSHM( int fd, SHMstruct *data);
extern SHMstruct * accessSHM(int fd);
extern void clearSHM(SHMstruct * shm);
extern void closeSHM(int fd);
extern void destroySHM(char * shname);
#endif
共享内存是一个相当大的话题; 仅仅说"这就是你打开一个的方式"真的是不够的。 在自己写一个之前,你可能要确保你需要这样做。
有几个库,包括 Boost 间进程,提供了创建和访问共享内存的包装器。 在决定编写自己的之前,您可能想看看那里。
如果您不能使用 Boost(或其他一些库(,并且确实必须自己编写一个,请记住,您还需要提供一种同步(锁定(方法,以便不会同时从多个进程进行读取和写入。 我建议查看其中一些库中的一些代码,甚至是堆栈溢出上的代码:在 Linux 上编写的简单共享内存应用程序以获取基础知识,但只要知道获得工作库需要相当多的代码。
您可以使用shmat调用附加并获取地址。
p_mem = (message *) shmat(shmid,0,0);
在此示例中,消息是一个结构。您可以使用任何数据类型。p_mem就像任何其他指针一样。
char *p_mem;
p_mem = (char *) shmat(shmid,0,0);
strcpy(p_mem, "test");
相关文章:
- 在 C++ 中访问 lambda 捕获初始化变量
- 初始化指向类实例的智能指针并访问其方法
- 使用值初始化访问构造函数?
- Windows C++静态库在初始化期间无法访问外部方法
- 在派生类的构造函数初始化中无法访问受保护的函数
- 有没有办法使用初始化到第一行的指针访问 2d 数组的第二行?
- 初始化指针时出现写入访问冲突
- 如何在 getter 的父类中初始化变量的情况下访问子类中的变量
- C++嵌套结构初始化和访问成员
- 访问未初始化的值,很可能在向量中
- 视觉C++ Int 似乎没有初始化并引发异常:读取访问冲突
- C 如何避免访问尚未初始化的对象的成员
- C - 空数对象的初始化发送不良访问错误
- 使用GLGENBUFFERS()访问违规,并以正确的顺序进行GLEW初始化
- 为什么未初始化的指针会导致接近 0 的 mem 访问冲突
- 如何正确创建、初始化和访问类的静态成员
- 聚合初始化不支持构造函数访问
- 使初始化变量可供多个属性初始化方法访问
- 使用memset初始化后,访问违反写作错误写入2D数组
- 访问和打印用 new 初始化的矢量的矢量