(完整版)大连理工大学操作系统实验四消息队列_第1页
(完整版)大连理工大学操作系统实验四消息队列_第2页
(完整版)大连理工大学操作系统实验四消息队列_第3页
(完整版)大连理工大学操作系统实验四消息队列_第4页
(完整版)大连理工大学操作系统实验四消息队列_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux进程间通信(IPC)实验四消息队列/s/1ntmRK4x消息队列就是一些消息的列表。用户可以从消息队列中添加消息和读取消息等。从这点上看,消息队列具有一定的FIFO特性,但是它可以实现消息的随机查询,比FIFO具有更大的优势。同时,这些消息又是存在于内核中的,由“队列ID”来标识。消息的结构。受到两方面约束,长度必须小于系统规定上限,其次,它必须以一个长整型变量开始,接受函数将用这个成员变量来确定消息类型structmy_message{ longmessage_type; /*data*/}消息队列消息队列的实现包括四种操作:创建或打开消息队列:msgget(),数量会受到系统消息队列数量的限制。添加消息:msgsnd(),把消息添加到已打开的消息队列末尾;读取消息:msgrcv(),把消息从消息队列中取走,与FIFO不同的是,这里可以指定取走某一条消息;控制消息队列:msgctl(),可以完成多项功能。消息队列消息队列消息队列消息队列消息队列创建队列#include<sys/msg.h>#include<sys/types.h>#include<sys/ipc.h>#include<stdio.h>#include<stdlib.h>intmain(void){

int

qid;

key_t

key;

key=113;

qid=msgget(key,IPC_CREAT|0666)

/*

创建一个消息队列

*/

if(qid<0){

/*

创建一个消息队列失败

*/

perror("msgget");

exit(1);

}

printf("createdqueueid:%d/n",qid);

/*

输出消息队列的

ID*/

system("ipcs-q");

/*

查看系统

IPC

的状态

*/

exit(0);}删除队列#include<sys/msg.h>#include<sys/types.h>#include<sys/ipc.h>#include<stdio.h>#include<stdlib.h>intmain(intargc,char*argv[]){

intqid;

if(argc!=2){/*

命令行参数出错

*/

puts("USAGE:del_msgq.c<queueID>");

exit(1);

}

qid=atoi(argv[1]);/*

通过命令行参数得到组

ID*/

system("ipcs-q");

if((msgctl(qid,IPC_RMID,NULL))<0){/*

删除指定的消息队列

*/

perror("msgctl");

exit(1);

}

system("ipcs-q");

printf("successfullyremoved%d

queue/n",qid);/*

删除队列成功

*/

exit(0);}发送队列#include<sys/msg.h>#include<sys/types.h>#include<sys/ipc.h>#include<stdio.h>#include<stdlib.h>structmsg{/*声明消息结构体*/longmsg_types;/*消息类型成员*/charmsg_buf[511];/*消息*/};intmain(void){intqid;intpid;intlen;structmsgpmsg;/*一个消息的结构体变量*/

pmsg.msg_types=getpid();/*消息类型为当前进程的ID*/sprintf(pmsg.msg_buf,"hello!thisis:%d/n/0",getpid());/*初始化消息*/len=strlen(pmsg.msg_buf);/*取得消息长度*/

if((qid=msgget(IPC_PRIVATE,IPC_CREAT|0666))<0){/*创建一个消息队列*/perror("msgget");exit(1);}

if((msgsnd(qid,&pmsg,len,0))<0){/*向消息队列中发送消息*/perror("msgsn");exit(1);}printf("successfullysendamessagetothequeue:%d/n",qid);exit(0);}接收队列#include<sys/msg.h>#include<sys/types.h>#include<sys/ipc.h>#include<stdio.h>#include<stdlib.h>#defineBUFSZ4096structmsg{

/*

声明消息结构体

*/

longmsg_types;

/*

消息类型成员

*/

charmsg_buf[511];

/*

消息

*/};intmain(intargc,char*argv[]){

int

qid;

int

len;

structmsgpmsg;

if(argc!=2){

/**/

perror("USAGE:read_msg<queueID>");

exit(1);

}

qid=atoi(argv[1]);

/*

从命令行中获得消息队列的

ID*/

/*

从指定队列读取消息

*/

len=msgrcv(qid,&pmsg,BUFSZ,0,0);

if(len>0){

pmsg.msg_buf[len]='/0';

/*

为消息添加结束符

*/

printf("readingqueueid:%05ld/n",qid);/*

输出队列

ID*/

/*

该消息类型就是发送消息的进程

ID*/

printf("messagetype:%05ld/n",pmsg.msg_types);

printf("messagelength:%dbytes/n",len);

/*

消息长度

*/

printf("mesagetext:%s/n",pmsg.msg_buf);/*

消息内容

*/

}

elseif(len==0)

printf("havenomessagefromqueue%d/n",qid);

else{

perror("msgrcv");

exit(1);

}

system("ipcs-q")

exit(0);}提示:ipcs–q查看消息队列信息作业编写一对程序recv.c和

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论