我正在编写一个使用共享内存的客户端服务器程序。我创建了一个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 error\n");
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);
}
}
shm.h
#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
答案 0 :(得分:1)
共享内存是一个相当大的主题;它真的不足以说'#34;这就是你打开它的方式。&#34;在自己编写之前,您可能需要确保需要这样做。
有几个库,包括Boost进程间,提供了创建和访问共享内存的包装器。在决定自己编写之前,你可能想看看那里。
如果你不能使用Boost(或其他一些库),并且真的必须自己编写一个,请记住,你还需要提供一种同步(锁定)方式,以便读取和写入不是从多个进程同时发生的。我建议从其中一些库中查看一些代码,或者甚至从stackoverflow上的代码中获取代码:A simple shared memory application written on Linux以获得基础知识,但只需了解它就知道它会变得相当多获取工作库的代码。
答案 1 :(得分:0)
您可以使用shmat调用附加并获取地址。
p_mem = (message *) shmat(shmid,0,0);
在此示例中,message是一个结构。您可以使用任何数据类型。 p_mem就像任何其他指针一样。
char *p_mem;
p_mem = (char *) shmat(shmid,0,0);
strcpy(p_mem, "test");