加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Linux消息队列实践(3)

发布时间:2020-12-13 20:23:41 所属栏目:PHP教程 来源:网络整理
导读: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个消

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,sizeof(myBuffer)); //从队首不断的取数据 for (int i = 0; i < MSGNUMBER; ++i) { int recvBytes = 0; if ((recvBytes = msgrcv(msgid,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,sizeof(myMsgBuf)); int recvBytes = msgrcv(msgid,&myMsgBuf,MAXMSGSIZE,0); if (recvBytes == ⑴) { err_exit("msgrcv error"); } fputs(myMsgBuf.mtext,stdout); if (msgsnd(msgid,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,stdin) != NULL) { if (msgsnd(msgid,0) == ⑴) { err_exit("msgsnd error"); } memset(&recvMsgBuf,sizeof(recvMsgBuf)); if (msgrcv(msgid,&recvMsgBuf,sizeof(recvMsgBuf),getpid(),0) == ⑴) { err_exit("msgrcv error"); } fputs(recvMsgBuf.mtext,stdout); memset(&myMsgBuf+4,sizeof(myMsgBuf)⑷); } } int main() { key_t key = ftok(FILESEED,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


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读