最新公告
  • 欢迎您光临波比源码,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 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. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

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

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    波比源码
    一个高级程序员模板开发平台
    升级波友尊享更多特权立即升级