当前位置: 首页 > news >正文

建设厅网站企业诚信分值郑州热门网络推广免费咨询

建设厅网站企业诚信分值,郑州热门网络推广免费咨询,外贸产品推广网站,广州和广州市注册公司区别文章目录消息队列有亲缘关系的进程使用消息队列通信无亲缘关系的进程使用消息队列通信使用环境:Ubuntu18.04 使用工具:VMWare workstations ,xshell作者在学习Linux的过程中对常用的命令进行记录,通过思维导图的方式梳理知识点&am…

文章目录

  • 消息队列
  • 有亲缘关系的进程使用消息队列通信
  • 无亲缘关系的进程使用消息队列通信

使用环境:Ubuntu18.04
使用工具:VMWare workstations ,xshell

  作者在学习Linux的过程中对常用的命令进行记录,通过思维导图的方式梳理知识点,并且通过xshell连接vmware中ubuntu虚拟机进行操作,并将练习的截图注解,每句话对应相应的命令,读者可以无障碍跟练。
  第九次练习的重点在于Linux的进程如何使用 消息队列进行进程通信。

消息队列

  • 消息队列和FIFO详细,都是一个队列结构,都可以有多个进程向队列里面写消息,多个进程从队列中读取消息。但是FIFO需要读写两端都事先代开,才能够开始信息的传递。而消息队列可以实现向队列中写消息,需要时再打开读取信息。但是,消息队列先打开读,仍然会阻塞,因为此时没有消息可读。
//头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
  • 函数int msgget(key_t key, int msgflg);创建和访问一个消息。成功返回唯一的消息队列标识符,类似于进程id,失败返回-1。
  1. 参数key是唯一表示一个消息队列的关键字,如果用IPC_PRIVATE(值为0),就只能创建一个只有创建者才能访问的消息队列,可用于父子间通信。非0的key(可以通过fork函数获取),表示创建一个可以被多个进程共享的消息队列,实现非亲缘关系的通信。
  2. 参数msgflg指明队列的访问权限和创建标志,创建标志的可选值为IPC_CREAT和IPC_EXCL,如果单独指定 IPC_CREAT,msgget 要么返回新创建的消息队列 id,要么返回具有相同 key 值的消息队列 id;如果 IPC_EXCL 和 IPC_CREAT 同时指明,则要么创建新的消息队列,要么当队列存在时,调用失败并返回-1。
  • 函数int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 将消息添加到消息队列中
    函数ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); 从消息队列中获取消息
  1. 参数msgid指明消息队列的ID;通常是msgget函数成功的返回值。
  2. 参数msgbuf是消息结构体,他的长度必须要小于系统规定的上限,必须以一个长整型成员变量开始,接受函数将用这个成员变量来确定消息的累心。此结构体必须重写,第一个参数不能修改,其他自定义。
struct msgbuf {long mtype; /* type of message */char mtext[1]; /* message text */
};
  1. 字段 mtype 是用户自己指定的消息类型(必须是正整数),该结构体第 2 个成员仅仅是一种说明性的结构,实际上用户可以使用任何类型的数据,就是消息内容。
  2. 参数msgsz是消息体的大小,每个消息体最大不超过4K。
  3. 参数msgflg可以为0(通常为0)或者IPC_NOWAIT,如果设置 IPC_NOWAIT,则msgsnd 和 msgrcv 都不会阻塞,此时如果队列满并调用 msgsnd 或队列空时调用 msgrcv将返回错误。
  4. 参数msgtyp类型有三种,msgtyp==0时,接收队列中的第一个消息,msgtyp>0时,接收队列中第一个类型等于msgtyp的消息,msgtyp<0时,接受类型小于等于msgtyp绝对值的第1个最低类型消息。
  • 函数int msgctl(int msqid, int cmd, struct msqid_ds *buf); 是消息队列的控制函数,常用来删除消息队列。
  1. 参数msqid是msgget返回的消息队列标识符。
  2. 参数cmd通常是IPC_RMID表示删除消息队列。
  3. 参数buf通常是NULL。

有亲缘关系的进程使用消息队列通信

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
//自定义消息结构体
struct msgbuf
{long mtype;char buf[64];
};int main()
{int msgid = msgget((key_t)1234,IPC_CREAT|0666);//创建一个消息队列if(msgid == -1){	//创建失败的处理perror("msgget error");exit(-1);}struct msgbuf msg;memset(&msg,0,sizeof(struct msgbuf));if(fork()>0){	//父进程处理msg.mtype = 1;strcpy(msg.buf,"hello");msgsnd(msgid,&msg,sizeof(msg.buf),0);	//将消息放入消息队列wait(NULL);		//等待子进程结束msgctl(msgid,IPC_RMID,NULL);	//删除消息队列exit(0);}else{	//子进程处理sleep(2);	//让父进程有时间将消息放入消息队列msgrcv(msgid,&msg,sizeof(msg.buf),1,0);	//从消息队列中取出消息puts(msg.buf);	//打印取出的消息值exit(0);}return 0;
}

运行效果:
在这里插入图片描述

无亲缘关系的进程使用消息队列通信

消息发送端源代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <unistd.h>
#define BUFFER 255
struct msgtype
{long mtype;char buffer[BUFFER+1];
};int main()
{int msgid = msgget((key_t)1234,0666|IPC_CREAT);	//获取唯一id1234的消息队列if(msgid == -1){perror("msgget");exit(1);}struct msgtype msg;memset(&msg,0,sizeof(struct msgtype));msg.mtype = 1;		//设置消息类型为2strncpy(msg.buffer,"hello",BUFFER);msgsnd(msgid,&msg,sizeof(msg.buffer),0);	//想msgid的消息队列发送消息memset(&msg,0,sizeof(msg);	//清空结构体msgrcv(msgid,&msg,sizeof(msg.buffer),2,0);	//从msgid的消息队列接收消息printf("接收到的消息内容是:%s\n",msg.buffer);return 0;
}

消息接收端源代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <sys/msg.h>
#include <sys/wait.h>
#define BUFFER 255struct msgtype
{long mtype;char buffer[BUFFER+1];
};int main()
{int msgid = msgget((key_t)1234,0666|IPC_CREAT);	//获取唯一id1234的消息队列if(msgid == -1){perror("msgget");exit(1);}struct msgtype msg;memset(&msg,0,sizeof(struct msgtype));while(1){msgrcv(msgid,&msg,sizeof(msg.buffer),1,0);	//从msgid的消息队列接收消息,类型为1printf("接收端端收到的消息:%s\n",msg.buffer);msg.mtype = 2;		//设置消息类型为2strncpy(msg.buffer,"world",BUFFER);msgsnd(msgid,&msg, sizeof(msg.buffer),0); //向msgid的消息队列发送消息if(sizeof(msg.buffer)!=0){break;}}return 0;
}

两个窗口运行结果:
在这里插入图片描述

http://www.mnyf.cn/news/37642.html

相关文章:

  • 佛山市网站建设公司产品软文范例1000字
  • 网站制作武汉智慧软文发稿平台官网
  • 做设备外贸b2b网站网络推广人员
  • 山东一建建设有限公司网站sem网络推广是什么
  • 用html做的网站步骤营销的方法手段有哪些
  • seo对网站的重要性怎么推广软件
  • 怎么用免费的网站空间电商网站建设报价
  • 什么是网络营销?嘉兴seo报价
  • 资阳网站制作如何制作一个公司网站
  • 二 网站建设的重要性最简短的培训心得
  • 北京网站建设网站开发sem优化
  • 做的网站上更改内容改怎么办百度网站站长工具
  • 贵阳专业网站建设公司谷歌seo搜索优化
  • 网站meta 优化建议本周国内重大新闻十条
  • wordpress数据库批量替换网址aso优化排名
  • flash 网站 源码宿迁网站建设制作
  • 微云做网站深圳网络营销的公司哪家好
  • 制作一个网站要多少钱杭州营销策划公司排名
  • 西安网站制作开发公司哪家好西安网站制作价格
  • 已建设英文网站的政府部门电商入门基础知识
  • 企业建设网站的目标厦门seo蜘蛛屯
  • 贸易公司网站建设要多少钱百度一下搜索引擎大全
  • 上海做网站服务商软文广告案例分析
  • 网站开发a — ajax淘宝营销推广方案
  • 手机网站建设品牌好百度seo霸屏软件
  • 苏州纳米所加工平台网站关键词百度自然排名优化
  • 广州做创客教室的厂家网站哈尔滨企业网站seo
  • 山东建大建设有限公司网站网站流量分析报告
  • 乌鲁木齐建设银行招聘网站seo快速优化文章排名
  • 安徽做网站哪家好aso优化注意什么