c - 使用 mmap 在 C 中共享内存中的结构

标签 c shared-memory mmap

我已经阅读了之前的问题和问题的答案,但是大多数似乎使用 shmget 而不是 mmap。

我使用 mmap 来共享内存,一切都工作正常,直到我从使用静态变量改为使用结构。目前,我收到以下错误:

server.c: In function ‘interfaceComms’:
server.c:129:18: error: ‘interfaceConnection’ undeclared (first use in this function)
  n = write(sock, interfaceConnection->processingResults, 47);
                  ^
server.c:129:18: note: each undeclared identifier is reported only once for each function it appears in
server.c:139:12: error: ‘imageDetails’ undeclared (first use in this function)
  if(strcmp(imageDetails->prevImage, "") != 0) {
            ^
server.c: In function ‘robotComms’:
server.c:162:2: error: ‘imageDetails’ undeclared (first use in this function)
  imageDetails->prevImage = imageDetails->currImage;
  ^
server.c:213:9: error: ‘interfaceConnection’ undeclared (first use in this function)
  strcpy(interfaceConnection->processingResults, msg);

我理解这个错误,但是我不确定如何使用结构来解决它,因为这是我认为共享内存的完成方式。我正在 fork ,因此这些结构正在子进程中使用。

我的代码:

typedef struct Images {
    char prevImage;
    char currImage;
} image;

typedef struct Robot {
    char coordinates;
} robot;

typedef struct Interface {
    char processingResults;
} interface;

int main(int argc, char *argv[]){
int sockfd, newsockfd, portno, clilen, memid;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n, pid;
interface *interfaceConnection;
image *imageDetails;

// First call to socket() function
sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd < 0){
    perror("Error opening socket");
    exit(1);
}

// Initialise socket structure
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = 5001;

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);

//Bind the socket
if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0){
    perror("Error binding socket");
    exit(1);
}

//Listen for client connections
listen(sockfd,5);
clilen = sizeof(cli_addr);

//Share memory before forking
interfaceConnection = mmap(NULL, sizeof(interface), PROT_READ | PROT_WRITE, 
                MAP_SHARED | MAP_ANONYMOUS, -1, 0);

imageDetails = mmap(NULL, sizeof(image), PROT_READ | PROT_WRITE, 
            MAP_SHARED | MAP_ANONYMOUS, -1, 0);

fork 发生后,函数“interfaceComms”和“robotComms”将被调用。但我猜我的问题出在某个地方。

根据要求,interfaceComms 和 robotsComms 函数:

void checkMessage(int sock){
int n;
char message[256];
n = read(sock, message, 255);
int response;

if(n < 0){
    perror("Error reading the socket");
    exit(1);
}

//see if the message is from the robot or from the interface
if(strstr(message,"robot") != NULL) {
    //The robot wants the co-ordinates of the component
    robotComms(sock);
} else {
    //Someone has accessed the main page
    interfaceComms(sock);
}
}

void interfaceComms(int sock) {
int n;

n = write(sock, interfaceConnection->processingResults, 47);

if (n < 0){
    perror("Error writing to the socket");
    exit(1);
} else {
    printf("Results sent to interface\n");
}
}

void robotComms(int sock) {
int n;
srand ( time(NULL) ); //reset rand
//printf("Here is the message: %s\n", message);
printf("Getting image...\n");

//Change currImage to prevImage
imageDetails->prevImage = imageDetails->currImage;

提前致谢。

最佳答案

您的问题是 interfaceConnection 是主函数中的局部变量。

interface *interfaceConnection;

我假设您希望在全局范围内实现这一点。如果没有看到其他代码,很难判断。

关于c - 使用 mmap 在 C 中共享内存中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35094304/

相关文章:

C 自由() : invalid pointer allocated in other function

FILE I/O 中的 C 程序搜索

c++ - IPC linux 中数组存储的段错误

C - 将结构成员的地址传递给函数错误返回

c - 如何处理 stat 和后续 mmap 之间的文件大小变化?

C通过递归函数写入文件

c++ - 搜索硬盘中所有文件的最快方法是什么?

multithreading - CUDA多个线程写入共享变量

c - 使用信号量同步共享内存

c++ - 我可以将可搜索字符设备 `/dev/mem_8` 映射到内存并使用 x86_64 指令访问它吗?