【发布时间】:2012-05-12 20:39:19
【问题描述】:
我正在尝试构建一个具有两个使用共享内存交换消息的进程的应用程序... 正如您将看到的,我正在做的是请求共享内存,然后在其中放入一个结构。 该结构由一个字符串、布尔标志和一个枚举值组成。 字符串应该保存消息,标志应该告诉对方是否看到了这条消息(因为如果内存中有未读消息,则不允许任何人添加消息) 我遇到了几个问题 1-我无法到达字符串处的字符串.... 2-当我用 int 替换字符串时,我在尝试访问内存时在客户端遇到问题 这是代码...
服务器端:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <iostream>
#include <string>
#include <sys/wait.h>
using namespace std;
enum e {Server,Client};
struct chat // struct that will reside in the memory
{
bool ifread; //boolian variable to determin if the message has been raed or not
e who;
char message[50];
int msgl;
};
int main(void)
{
string temp;
int shmid;
//key_t key=ftok(".",'a');
key_t key=433;
if ((shmid = shmget(key, sizeof(chat), IPC_CREAT | 0666)) < 0)
{
cout<<"shmget"<<endl;
return(1);
}
chat *str ;
str = (chat *)shmat(shmid, NULL, 0);
pid_t pid;
pid=fork();
str->ifread==true;
str->who=Server;
if(pid==0)
{
while(temp!="bye")
{
if(str->ifread==false && str->who==Client)
{
//cout<<"Client said : ";
for(int i=0;i<str->msgl;i++)
cout<<str->message[i];
str->ifread==true;
}
}
}
else if (pid>0)
{
while(temp!="bye")
{
getline(cin,temp);
str->msgl=temp.length();
if(str->ifread)
{
str->who=Server;
for(int i=0;i<str->msgl;i++)
{
str->message[i]=temp.at(i);
}
str->who=Server;
str->ifread==false;
}
else if (!str->ifread && str->who==Client)
{
sleep(1);
waitpid(pid,NULL,0);
}
}
}
shmctl (shmid, IPC_RMID, NULL);
}
客户端:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <iostream>
#include <string>
#include <sys/wait.h>
using namespace std;
enum e {Server,Client};
struct chat // struct that will reside in the memory
{
bool ifread; //boolian variable to determin if the message has been raed or not
e who;
char message[50];
int msgl;
};
int main(void)
{
string temp;
int shmid;
//key_t key=ftok(".",'a');
key_t key=433;
if ((shmid = s`hmget(key, sizeof(chat), 0666)) < 0)
{
cout<<"shmget"<<endl;
return(1);
}
chat *str ;
str = (chat *)shmat(shmid, NULL, 0);
pid_t pid;
pid=fork();
if(pid==0)
{
while(temp!="bye")
{
if(str->ifread==false && str->who==Server)
{
//cout<<"Server said : ";
for(int i=0;i<str->msgl;i++)
cout<<str->message[i];
str->ifread==true;
}
}
}
else if (pid>0)
{
while(temp!="bye")
{
getline(cin,temp);
str->msgl=temp.length();
if(str->ifread)
{
str->who=Client;
for(int i=0;i<str->msgl;i++)
{
str->message[i]=temp.at(i);
}
str->ifread=false;
}
else if (!str->ifread && str->who==Server)
{
sleep(1);
//waitpid(pid,NULL,0);
}
}
}
shmctl (shmid, IPC_RMID, NULL);
}
在此先感谢,对于糟糕的英语感到抱歉.....
编辑: 谢谢 aix 但还有另一个问题,即客户端首先无法从共享内存中获取任何数据,即使我使用 int x 在它们之间交换数字 即使服务器已经放置了另一个值,客户端首先仍然给出 0,然后在调用 shmget() 时它开始给我一个错误;
edit(2):我做了一些更改,但仍然无法正常工作....
编辑(3):问题已解决谢谢大家,结果是对标志的排序不正确 再次感谢...
【问题讨论】:
-
通常最好坚持使用 POD 类型来共享内存。
标签: c++ linux memory shared-memory shared