用消息队列实现进程通信(unix下c语言)

jianfengshxy 2008-04-06 11:44:54
小弟刚学unix下c编程,现在要实现两个进程用消息队列的通信.我程序1建立消息队列2008,用通道1来发消息,通道2来接收消息.发送消息同时发送SIGUSR1,接收方响应,开始接收.程序2,用管道2来发送消息,而管道1来接收消息.但是,我的程序一执行系统就注消了.高手情看看我的程序错在哪儿.下面是程序1的代码,程序2只需要将通道换一下即可.
struct Msg{
long chan; //消息队列的通道号
char content[100]; //消息的内容
};
using namespace std;

//当对方发送SIGUSR1信号,listen响应,开始接收信息
void listen(int sig)
{
signal(sig,listen);
Msg msg;
int key=2008;
int qid=msgget(key,0);
if(qid<0)
{
cout<<"error qid receive"<<endl;
return ;
}
if(msgrcv(qid,&msg,sizeof(msg),2,IPC_NOWAIT)<0)
cout<<"error receive"<<endl;
else
cout<<"receieve successfully"<<endl;
}
int main()
{
signal(SIGUSR1,listen);
char name[256];
if(gethostname(name,256)!=0){
cout<<"get hostname failure"<<endl;
return -1;
}
int key=2008;
int qid=msgget(key,IPC_CREAT|0600); //生成消息队列2008
if(qid<0){
cout<<"create message queue failure."<<endl;
return -1;
}
cout<<"start chat:"<<endl;
Msg msg;
msg.chan=1;
while(true) //开始不停的写,直到SIGUSR1到,
{
cout<<name<<":";
cin>>msg.content;
if(strcmp(msg.content,"q")==0)
{
cout<<"exit"<<endl;
return 0;
}
if(msgsnd(qid,&msg,sizeof(msg),0)<0)
{
cout<<"error send!"<<endl;
return -1;
}
else
{
kill(-1,SIGUSR1); //发送SIGUSR1信号
cout<<"send success"<<endl;
}

}
}
...全文
118 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-04-06 11:44
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下