Linux消息队列实践(3)


API综合使用

//父进程发送消息,子进程接收消息
struct msgBuf
{
long mtype; /* message type, must be > 0 */
char mtext[104]; /* message data */
};
const int MSGNUMBER = 10;

int main()
{
//获得1个键
key_t msgKey = ftok("/tmp/mySeedFile",’f’);
//获得1个消息队列
int msgid = msgget(msgKey,IPC_CREAT|0666);
if (msgid == ⑴)
{
err_exit("msgget error");
}

struct msgBuf myBuffer;

pid_t pid = fork();
if (pid == ⑴)
{
err_exit("fork error");
}
//父进程,发送数据
if (pid > 0)
{
myBuffer.mtype = getpid();
//向消息队列中发送消息,如果队列full,则该进程1直阻塞
for (int i = 0; i < MSGNUMBER; ++i)
{
sprintf(myBuffer.mtext,"Hello, My Number is %d",i);
msgsnd(msgid,&myBuffer,strlen(myBuffer.mtext),0);
}

  //等待子进程结束
wait(NULL);
}
else if (pid == 0) //子进程
  {
  //睡眠1秒,等待父进程发送结束
sleep(1);
memset(&myBuffer,0,sizeof(myBuffer));
//从队首不断的取数据
for (int i = 0; i < MSGNUMBER; ++i)
{
int recvBytes = 0;
if ((recvBytes = msgrcv(msgid,&myBuffer,sizeof(myBuffer.mtext),
getppid(),IPC_NOWAIT)) == ⑴)
{
err_exit("msgrcv error");
}
else
{
cout << "recvBytes = " << recvBytes << endl;
cout << "myBuffer.mtype = " << myBuffer.mtype << endl;
cout << " " << myBuffer.mtext << endl;
}
}
cout << "strlen(myBuffer.mtext) = " << strlen(myBuffer.mtext) << endl;
}
return 0;
}

消息队列项目开发案例

消息队列实现回射客户/服务器

/**1个简化实现->程序说明:
  1.客户端发送数据格式:
  类型为:客户端pid
  内容为键盘输入的内容
2.客户端接收格式
  类型为自己的pid
  内容为服务器发送过来的内容

  3.服务器接收的数据
  类型为客户端pid
  内容为各个客户真个消息内容
  4.服务器发送的数据
  类型为客户端id
  内容为客户端消息内容
*/

//server.cpp
#include "commen.h"

void echo_server(int msgid)
{
struct msgBuf myMsgBuf;

while (true)
{
memset(&myMsgBuf,0,sizeof(myMsgBuf));
int recvBytes = msgrcv(msgid,&myMsgBuf,MAXMSGSIZE,0,0);
if (recvBytes == ⑴)
{
err_exit("msgrcv error");
}

fputs(myMsgBuf.mtext,stdout);
if (msgsnd(msgid,&myMsgBuf,strlen(myMsgBuf.mtext),0) < 0)
{
err_exit("msgsnd error");
}
}
}

int main()
{
key_t key = ftok(FILESEED,’f’);
int msgid = msgget(key,0666|IPC_CREAT);
if (msgid == ⑴)
{
err_exit("msgget error");
}

echo_server(msgid);

return 0;
}

//client.cpp
#include "commen.h"

void echo_client(int msgid)
{
struct msgBuf myMsgBuf,recvMsgBuf;
myMsgBuf.mtype = getpid();

while (fgets(myMsgBuf.mtext,MAXMSGSIZE,stdin) != NULL)
{
if (msgsnd(msgid,&myMsgBuf,strlen(myMsgBuf.mtext),0) == ⑴)
{
err_exit("msgsnd error");
}

memset(&recvMsgBuf,0,sizeof(recvMsgBuf));
if (msgrcv(msgid,&recvMsgBuf,sizeof(recvMsgBuf),getpid(),0) == ⑴)
{
err_exit("msgrcv error");
}

fputs(recvMsgBuf.mtext,stdout);

memset(&myMsgBuf+4,0,sizeof(myMsgBuf)⑷);
}
}

int main()
{
key_t key = ftok(FILESEED,’f’);
int msgid = msgget(key,0666);
if (msgid == ⑴)
{
err_exit("msgget error");
}

echo_client(msgid);

return 0;
}

//commen.h
#ifndef COMMEN_H_INCLUDED
#define COMMEN_H_INCLUDED

#include <string>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>

const char FILESEED[] = "/tmp/mySeedFile";
const int MAXMSGSIZE = 1024;

struct msgBuf
{
long mtype; //Message Type: Client PID
char mtext[MAXMSGSIZE]; //message data
};

void err_exit(std::string str)
{
perror(str.c_str());
exit(EXIT_FAILURE);
}

#endif // COMMEN_H_INCLUDED

开辟眼界


附-Makefile

CC = g++
CPPFLAGS = -Wall -g

BIN = client server
SOURCES = $(BIN.=.cpp)

.PHONY: clean all

all: $(BIN)

$(BIN): $(SOURCES)

clean:
-rm -rf $(BIN) bin/ obj/ core

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » Linux消息队列实践(3)

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡