`
microjava
  • 浏览: 318859 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

UNIX系统通讯--学习笔记(一)

阅读更多
UNIX系统通讯--学习笔记

1.IPC
--IPC系统简介
-IPC进程间通讯(Interprocess Communication)
1.消息队列(Message queue,q):应用与不同进程间少量数据的顺序共享
2.信号量(Semaphore,s):应用与进程之间的同步与互斥的控制
3.共享内存(Share Memory,m):应用与进程之间大批量数据的随即共享访问

  1.1 查询IPC对象
shell命令ipcs查询当前系统的ipc对象信息
命令:ipcs[options]
-q 只查询ipc对象中的消息队列
-s 只查询ipc对象中的信号量
-m 只查询ipc对象中的共享内存
-a 查询ipc对象的全部属性
默认 -qsm

IPC对象的标识号ID:
-标识号为非负整数,unix通过标识号在系统唯一确定IPC对象。
-不同类型IPC对象的标识号可以相同,但同类型IPC对象的标识号一定唯一。

IPC对象的关键字KEY
-创建IPC对象,必须指定一个IPC关键字,为一个32位的整数。
    
  1.2 删除IPC对象
shell命令ipcrm可以删除IPC对象信息
命令:ipcrm[options]

-q id  删除标识号为id的消息队列
-Q key 删除关键字为key的消息队列
-s id  删除标识号为id的信号量
-S key 删除关键字为key的信号量
-m id  删除标识号为id的共享内存
-M key 删除关键字为key的共享内存

ipcs -aq | grep 1234
chmod 777 msg_msgsnd1
./msg_msgsnd1
ipcsrm -q 1966292
ipcsrm -q 1234

  1.3 IPC结构
/usr/include/sys/ipc.h
	/* Common IPC Structures */
	struct ipc_perm 
	{
		uid_t uid;
		gid_t gid;
		uid_t cuid;
		gid_t cgid;
		mode_t mode;
		unsigned short seq;
		key_t key;
	}

  1.4 IPC内核限制
-消息队列:消息的最大长度,队列最大字节数,消息总数。
-信号量:最多可用信号量集,每个信号量集中最多的信号量个数,可用的信号量最大数。

--消息队列简介
-先进先出的队列数据结构,是一个链表。

  2.1 消息队列结构
/usr/include/sys/msg.h
	struct msqid_ds
	{
		struct ipc_perm msg_perm;
		struct msg      *msg_first;
		struct msg      *msg_last;
		unsigned int    msg_cbytes;
		msgqnum_t       msg_qnum;
		msglen_t        msg_qbytes;
		pid_t		msg_lspid;
		pid_t		msg_lrpid;
		time_t		msg_stime;
		time_t		msg_rtime;
		time_t		msg_ctime;  
	};


ipcs -aq

  2.2 消息结构
/usr/include/sys/msg.h
	struct msg
	{
		struct msg;
		long   msg;
		short  msg_ts;
		short  msg_sport;
	};

	struct msgbuf
	{
		long mtype;
		char mtext[1]
	};


--消息队列函数介绍
  3.1 消息队列的创建
int msgget(key_t key,int msgflg);
-参数key是消息队列一关键字,具有唯一性。
-参数msgflg的低9位指定了队列的属主,属组和其他用户的访问权限,参数msgflg的其他位指定了

消息队列的创建方式。
  * IPC_CREATE:创建消息队列,若存在就打开。
  * IPC_EXCL:同IPC_CREATE一起使用,创建一个不存在的消息队列,若存在则函数调用失败。

vi msg_msgget.c

#include<sys/msg.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<stdio.h> 
#include<sys/errno.h>
extern int errno;
struct mymsgbuf
{
	long mtype;
	char ctext[100];
}
void main()
{
	int msid;
	struct mymsgbuf buf;
	if((msid = msgget(0x1234,0666|IPC_CREAT)) < 0)
	{
		fprintf(stderr,"open msg %X failed.\n",0x1234);
		return;
	}
}


ipcs -q | grep 1234

cc -o msg_msgget msg_msgget.c
l msg_msgget
./msg_msgget

ipcs -aq | grep 1234


  3.2 消息队列的发送
int msgsnd(int msqid,struct msgbuf *msgp,int msgsz,int msgflg);

* 参数msqid指定了发送消息队列的标识号。
* 参数msgp指向存储发送消息内容的内存地址。
* 参数msgsz指定发送消息数据的长度,不包括消息类型部分。
* 参数msgflg控制消息发送的方式。
* IPC_NOWAIT:消息采用非阻塞方式发送。

造成msgsnd()等待的条件有两种:
1.消息队列满:当前消息的大小与当前消息队列中的字节数之和超过了消息队列的总容量。
msg_cbytes + msgsz > msg_qbytes

2.消息总数满:系统中所有的消息队列的消息总数已经达到了操作系统的上限值。

vi msg_msgsnd.c
#include<sys/msg.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<stdio.h> 
#include<sys/errno.h>
extern int errno;
struct mymsgbuf
{
	long mtype;
	char ctext[100];
}
void main()
{
	int msid;
	struct mymsgbuf buf;
	if((msid = msgget(0x1234,0666|IPC_CREAT)) < 0)
	{
		fprintf(stderr,"open msg %X failed.\n",0x1234);
		return;
	}
	while(strncmp(buf.ctext,"exit",4))
	{
		memset(&buf,0,sizeof(buf));
		fprintf(stderr,"Please input:");

		fgets(buf.ctext,sizeof(buf.ctext),stdin);
		buf.mtype = 1000;
		
		while((msgsnd(msid,&buf,strlen(buf.ctext),0)) < 0)
		{
			if(errno == EINTR) continue;
			return;
		}
	}
}


cc -o msg_msgsnd msg_msgsnd.c
ipcs -aq | grep 1234
ipcrm -Q 1234
./msg_msgsnd
ipcs -aq | grep 1234

  3.3 消息队列的接收
  3.4 消息队列的控制

--消息队列的常见应用模型
  4.1 单消息队列完成(对等进程间)的双向通讯
  4.2 双消息队列完成(对等进程间)的双向通讯
  4.3 多消息队列完成(对等进程间)的双向通讯
  4.4 单消息队列完成(客户-服务器进程间)的双向通讯
  4.5 双消息队列完成(客户-服务器进程间)的双向通讯
  4.6 多消息队列完成(客户-服务器进程间)的双向通讯


2.Socket

3.Tuxedo
分享到:
评论

相关推荐

    《UnixShell实例精解》-学习笔记.doc

    Shell 是一种特殊的程序,被用作用户与内核(kernel)的 UNIX 操作系统核心通讯。常见的 Shell 有 C shell、B shell 和 Korn shell(B shell 的超集)。 二、Unix Shell 主要功能 Shell 的主要功能包括: 1. 解释...

    吐血整理,经典Linux入门学习笔记

    - 目的是开发一个类Unix系统——GNU系统。 - FSF还推出了GNU通用公共许可证(GPL),旨在保护软件的自由性。 - **GPL**(General Public License): - GPL是适用于大多数自由软件基金会软件的一种许可证。 - 它...

    Ubuntu Linux实用学习笔记.doc

    - **文件属性与权限**:理解UNIX系统的文件属性和存取权限对于管理和保护文件至关重要。 - **手动分区**:了解如何手动进行磁盘分区,包括选择文件系统、指定挂载点和实际分区过程。 #### 六、安装与优化 - **软件...

    linux网络编程学习笔记

    domain:说明我们网络程序所在的主机采用的通讯协族(AF_UNIX 和AF_INET 等). AF_UN IX 只能够用于单一的 Unix 系统进程间通信,而 AF_INET 是针对Internet的,因而可以允许在 远程 主机之间通信(当我们 man socket ...

    Apache服务器配置与使用工作笔记.pdf

    以上知识点为个人学习笔记内容,用于Apache服务器的配置与使用,需掌握以上内容来保障Apache服务器的稳定运行和安全配置。在实际应用中,根据具体需求对知识点进行深入学习和实践。注意,上述内容是基于对Apache...

    聊天系统(java+applet)_modified_modified.zip

    这个系统可能是一个基本的实时通讯平台,允许用户进行文字聊天,甚至可能包括了音频或视频通信功能。Applet是Java的一种小程序,它可以在支持Java的浏览器上运行,这使得聊天系统可以方便地在Web环境下部署和使用。 ...

    计算机级网络技笔试知识点.doc

    - **工作站**:基于RISC和UNIX-OS的专业工作站以及基于Intel和Windows-OS的PC工作站。 **5. 计算机的技术指标** - **字长**:字长是指计算机能直接处理的二进制数据的位数,通常用来衡量计算机的数据处理能力。8个...

    计算机基础习题与答案.pdf

    涉及的操作系统有Windows 2000、Windows NT、DOS、Unix,这些都是早期或现在仍广泛使用的一些操作系统。操作系统是管理计算机硬件与软件资源的程序,它提供用户操作界面和基本服务。 3. 计算机网络与通讯 文件中...

    灰尘笔记:我从不同项目中写的一堆笔记

    在“灰尘笔记”这个压缩包中,包含了作者在多个项目中积累的各种技术知识点,主要涉及JavaScript、Python、Java、TeX、AWS(Amazon Web Services)、系统管理、Discord以及TeX排版等多个方面。以下是对这些主题的...

    办公自动化应用技术培训课件.pptx

    办公自动化系统包括计算机操作系统,如Unix、Linux和Windows,以及OA系统和MIS系统。OA系统主要用于事务性和信息处理的自动化,而MIS系统是一个集成的人机系统,用于信息的收集、传输、加工、储存和维护,支持组织的...

    办公自动化应用技术.pptx

    以Unix、Linux和Windows为代表的计算机操作系统为各种应用提供了运行平台。而OA系统(Office Automation System)和MIS系统(Management Information System)则是办公自动化软件的核心。OA系统负责事务性和信息处理...

    计算机基础知识(计算机概述).pdf

    系统软件,如DOS、Windows、Linux、Unix、Mac OS、Android和iOS,是操作系统层面的软件,负责管理和调度计算机资源。而应用软件则是用户直接使用的程序,例如Microsoft Office套件用于文档处理,QQ和YY提供即时通讯...

    Lotus企业应用解决方案.rar

    1. Lotus Notes:作为Lotus平台的核心组件,Notes是一种集成了电子邮件、日历、任务、笔记、数据库和应用程序开发的客户端软件。它支持离线工作模式,使得员工在无网络连接时也能处理事务。Notes还提供强大的安全性...

Global site tag (gtag.js) - Google Analytics