IPC消息队列使用详细分析

来源:互联网 发布:淘宝裂变软件都有哪些 编辑:程序博客网 时间:2024/05/16 03:05

  虽然说是进程间通信中有关消息队列的一个比较详细的分析

  同样的,共享内存,信号量和消息队列的公共部分知识也都同理

 

  首先:使用XSI IPC需要首先了解标识符和键的概念

  标识符是标识IPC对象的一个量,通常由一个int型变量表示,不过标识符只是IPC对象的内部名,如果要使的多个进程能够使用同一个IPC,需要得到一个外部名,这个外部名就是键--KEY,每个IPC对象都与一个键相关联

  对于消息队列:可以通过函数magget通过一个键获得他的标识符,即通过外部标识得到内部标识的一个方法

  例如:我们知道一个消息队列的键是msg_key;

  那么:可以通过下列代码段

  int msg_id;

  nsg_id=msgget(msg_key,0666|IPC_CREAT|IPC_EXCL);

  获取消息队列的ID。

  得到了消息队列的ID后,我们就可以开始作很多行为了

  如果你想要改变消息队列的一些属性,可以使用函数msgctl

  如果想从消息队列中发送消息或获取消息,可以使用这两个函数

  msgsnd,msgrcv

  下面详细讲解一下msgsnd

  这个函数的原型是:

  int msgsnd(int msgid,const void *ptr,size_t nbytes,int flags);

  第一个参数是消息队列的ID

  第二个参数是要发送给消息队列的正长整形类型字段    稍后解释这个参数

  第三个参数是要发送的实际数据字节(对应于长度)

  第四个参数是设置符

 

  如果我们想发送一段数据,我们可以这样做:

  首先,建立一个这样的结构体

  struct mymsg

  {

      long mtype;                      //这就是第二个参数所说的正长整形类型字段,表示发送信息的类型

      char mtext[SIZE];             //size 可以自定,跟第三个参数有关

  };

 

  下面是向消息队列发送一段数据的代码段

  struct mymsg
    {
        long type;
        char mtext[10];
    } msg;
    msg.type=1;
    strcpy(msg.mtext,"hello");
    if(msgsnd(msg_id,&msg,10,IPC_NOWAIT)==-1)
        fatal("msgsnd");

    printf("send sucess!/n");
    exit(0);

  值得注意的是,第三个参数是结构体中第二个成员的大小,而不是整个结构体的大小 

 

 下面是《unix环境高级编程》中第15章中习题5.12   刚写的  发出来吧,希望对大家能够有所帮助,如果

有朋友也在看这本书的话,很希望多多交流~~

 

原创粉丝点击