消息队列实现进程间通讯

描述

创建消息队列

消息队列的创建,需要用到msgget函数。

int msgget(key_t key, int msgflg);

key:该参数是消息队列的唯一标识,由ftok生成。
msgflg:取值有以下几个选择:IPC_CREAT、IPC_EXCL ,这两个参数详细的作用可以man msgflg看详细介绍。

返回值:返回一个近乎唯一的Message queue id

我们可以指定一个文件,调用ftok ,它会根据这个文件的 inode,生成一个近乎唯一的 key。

key_t ftok(const char *pathname, int proj_id);


pathname:文件信息,必须指定在一个存在的,可访问的文件。
proj_id:8bit的数据,0-255随意设定。

这样就可以获得一个近乎唯一的key了!

只要在这个消息队列的生命周期内,这个文件不要被删除就可以了。只要不删除,无论什么时刻,再调用 ftok,也会得到同样的 key。

综上,创建一个消息队列只需两步:

①:ftok生成一个key

②:msgget生成一个消息队列的ID

如下:

int main() {
  int messagequeueid;
  key_t key;
 
 
  if((key = ftok("/root/messagequeue/messagequeuekey", 1)) < 0)
  {
      perror("ftok error");
      exit(1);
  }
 
 
  printf("Message Queue key: %d.n", key);
 
 
  if ((messagequeueid = msgget(key, IPC_CREAT|0777)) == -1)
  {
      perror("msgget error");
      exit(1);
  }
 
 
  printf("Message queue id: %d.n", messagequeueid);
}

ftok要指定一个存在的文件,所以我们在执行之前,需要创建该文件。
查看消息队列:

System V IPC 体系有一个统一的命令行工具:ipcmk,ipcs 和 ipcrm 用于创建、查看和删除 IPC 对象。

查看创建的IPC对象:ipcs -q
dong@ubuntu:~//Interprocess_Communication$ ipcs
------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x01110005 0          dong       777        0            0          
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
------ Semaphore Arrays --------
key        semid      owner      perms      nsems

 发送消息
消息队列发送消息,主要调用msgsnd 函数。


int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
msqid:该参数是msgget所得到的message queue 的 id
msgp:消息结构体
struct msg_buffer {
   long mtype;
   char mtext[1024];
};


msgsz:表示消息结构体中,mtext最大长度。
msgflg:一位掩码,可取值有:IPC_NOWAIT、MSG_COPY、MSG_EXCEPT、MSG_NOERROR,取值说明可见man msgsnd
 接收消息
消息队列接收消息,主要调用msgrcv 函数。
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
                     int msgflg);
msqid:该参数是msgget所得到的message queue 的 id
msgp:消息结构体

msgsz:可接收数据最大长度

msgflg:一位掩码,可取值有:IPC_NOWAIT、MSG_COPY、MSG_EXCEPT、MSG_NOERROR,取值说明可见man msgsnd
有了消息这种模型,两个进程之间的通信就像咱们平时发邮件一样,你来一封,我回一封,可以频繁沟通了。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分