Linux进程间通信4-6

Linux使用的进程间通信方式包括:

1、管道(pipe)和有名管道(FIFO

2、信号(signal

3共享内存

4消息队列

5、信号量

6、套接字(socket


本文介绍4-6的通信方式


4、消息队列

Unix 早期 通信机制之一的信号能够传送的信息量有限,管道则 只能传送无格式的字节流 ,这无疑会给应用程序开发带来不便。 消息队列(也叫做报文队列)则克服了这些缺点。

消息队列 就是一个消息的链表 . 可以把消息看作一个记录,具有特定的格式 . 进程可以向中按照一定的规则添加新消息 ; 另一些进程则可以从消息队列中读走消息


目前主要有两种类型的消息队列:

   POSIX消息队列以及系统V消息队列,系统V消息队列目前被大量使用


系统V消息队列是随内核持续的,只有在内核重起或者人工删除时,该消息队列才会被删除
消息队列的内核持续性要求每个消息队列都在系统范围内对应唯一的键值,所以,要获得一个消息队列的描述字,必须提供该消息队列的键值

设置键值
#include <sys/ types.h >

 #include <sys/ipc.h>

   key_tftok (char*pathname, char proj)

功能:   返回文件名对应的键值。
 pathname:  文件名
 proj :         项目名(不为 0 即可)



打开消息队列

   #include <sys/types.h>

   #include <sys/ipc.h>

   #include <sys/msg.h>

   intmsgget(key_t key, intmsgflg)


key :键值,由 ftok 获得。

   msgflg:标志位。

返回值:与健值 key 相对应的消息队列描述字

IPC_CREAT     创建新的消息队列

IPC_EXCL        与IPC_CREAT一同使用,表示如果要创建的消息队列已经存在,则返回错误。

IPC_NOWAIT   读写消息队列要求无法得到满足时,不阻塞


在以下两种情况下,将创建一个新的消息队列:

1、如果没有与健值key相对应的消息队列,并且 msgflg中包含了IPC_CREAT标志位。

2key参数为IPC_PRIVATE


发送消息

include<sys/types.h>

#include<sys/ipc.h>

#include<sys/msg.h>

intmsgsnd(intmsqid,struct msgbuf*msgp,intmsgsz,intmsgflg)

功能:向消息队列中发送一条消息


接收消息

#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/msg.h>

intmsgrcv(intmsqid, struct msgbuf *msgp, int  msgsz, long msgtyp, intmsgflg)

功能:

  msqid代表的消息队列中读取一个msgtyp类型的消息,并把消息存储在msgp指向的msgbuf结构中。在成功地读取了一条消息以后,队列中的这条消息将被删除




5、信号量

信号量 ( 又名: 信号灯 ) 与其他进程间通信方式不大相同,主要用途是 保护临界资源 .
进程可以根据它判定是否能够访问某些共享资源。除了用于访问控制外, 还可用于进程同步

信号量的分类:
二值信号灯 :信号灯的值只能取 0 1 ,类似于互斥锁。 但两者有不同:
信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值;
互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。 
计数信号灯 :信号灯的值可以取任意非负值


6、套接字

1、 socket套接字:

     socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭).
     说白了Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

       注意:其实socket也没有层的概念,它只是一个facade设计模式的应用,让编程变的更简单。是一个软件抽象层。在网络编程中,我们大量用的都是通过socket实现的。

2、套接字描述符

          其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr。

套接字API最初是作为UNIX操作系统的一部分而开发的,所以套接字API与系统的其他I/O设备集成在一起。特别是,当应用程序要为因特网通信而创建一个套接字(socket)时,操作系统就返回一个小整数作为描述符(descriptor)来标识这个套接字。然后,应用程序以该描述符作为传递参数,通过调用函数来完成某种操作(例如通过网络传送数据或接收输入的数据)。在许多操作系统中,套接字描述符和其他I/O描述符是集成在一起的,所以应用程序可以对文件进行套接字I/O或I/O读/写操作。

当应用程序要创建一个套接字时,操作系统就返回一个小整数作为描述符,应用程序则使用这个描述符来引用该套接字需要I/O请求的应用程序请求操作系统打开一个文件。操作系统就创建一个文件描述符提供给应用程序访问文件。从应用程序的角度看,文件描述符是一个整数,应用程序可以用它来读写文件。














































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值