共享内存中的无限循环

时间:2018-03-12 18:35:57

标签: c shared-memory

在Ubuntu虚拟机中,我创建了两个名为“server”和“client”的c程序。当我使用输入(某个整数)运行服务器然后运行客户端时,客户端将输出我给服务器的整数。这适用于共享内存。我的问题是,在客户端收到信息后,它将变量设置为“CONSUMED”,并且服务器有一个等待发生这种情况的循环,但它似乎永远不能正常工作。如果我完全删除循环,这一切都有效,但我需要它在那里能够确保客户端接收整数,并且我不会在没有它发生的情况下继续。

这是我的server.c代码:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/types.h>
#include "shm.h"

int main(int argc, char* argv[]){

   int retVal = 0;
   ShmData *addr;  

   if(argc != 2){
      printf("please enter 1 argument.\n");
      return 0;
   }

   int fd = shm_open("shm.h", O_CREAT | O_RDWR , 0666);
   if(fd == -1){
      printf("!!!error with shm_open.\n");
   }

   if(ftruncate(fd, sizeof(ShmData)) == -1){        
      printf("!!!error with ftruncate.\n");
   }

   addr = mmap(0, sizeof(ShmData), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

   if(addr == MAP_FAILED){
      printf("!!!error with mmap.\n");
   }

   addr->status = INVALID;
   addr->data = atoi(argv[1]);
   addr->status = VALID;

   printf("[Server]: Server data Valid... waiting for client\n");

   while(addr->status != CONSUMED){
      sleep(1);                        //THIS LOOP NEVER EXITS
   }

   printf("[Server]: Server Data consumed!\n");

   munmap(addr, 0);         
   if(close(fd) == -1){ 
      printf("!!!error with close.\n");
   }
   shm_unlink("smh.h");

   printf("[Server]: Server exiting...\n\n\n");


   return(retVal);

}

这是我的client.c代码:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/types.h>
#include "shm.h"

int main(int argc, char* argv[]){

   int retVal = 0;

   int fd = shm_open("shm.h", O_CREAT | O_RDWR , 0666);
   if(fd == -1){
      printf("!!!error with shm_open.\n");
   }

   ShmData *addr;  
   addr = mmap(0, sizeof(ShmData), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

   printf("[Client]: Waiting for valid data ...\n");

   while(addr->status != VALID){
      sleep(1); 
   }

   printf("[Client]: Received %d\n", addr->data);

   addr->status = CONSUMED;

   munmap(addr, 0);         

   printf("[Client]: Client exiting...\n");

   return(retVal);

}

这是shm.h文件:

enum StatusEnum{INVALID, VALID, CONSUMED};

typedef struct{
   enum StatusEnum status;
   int data;
}ShmData;

我一直在电脑屏幕上撞了很长时间,但我仍然没有看到我的代码有什么问题。如何让这个循环成功并退出?

0 个答案:

没有答案