Linux不但继承了unix的system VIPC通信机制,同时还继承了基于套接字(socket)的进程间通信机制(该机制可以使进程运行在不同的主机上,即进行网络通信)
1、管道
特点:数据只能由一个进程流向另一个进程(写管道和读管道),若要进行全双工通信,需要建立两个管道。管道只能用于具有亲缘关系的进程间通信。
常见用法:在父进程创建子进程后向子进程传递参数。
2、有名管道
特点:在不具有亲缘关系的进程间进行通信
FIFO(First In First Out):不同于管道之处在于它提供了一个路径名与之关联,以FIFO的文件形式存储于文件系统中,是一个设备文件 ,是一个存储于硬盘上的文件(故使用时必须先调用open()将其打开),而管道是一个存储于内存中的特殊文件。即使进程与创建FIFO的进程不从在亲缘关系,但只要访问该路径,就能通过FIFO相互访问。
创建有名管道的方法:
一是在shell 下交互的建立一个有名管道,二是在程序中使用系统函数建立(mknod,mkfifo)。
3、消息队列
特点:一个存放在内核中的消息链表,每个消息队列是由消息队列标识符标识。
A、关于消息队列的重要数据结构
》消息缓冲结构(消息队列中消息的大小是受限制的,是由中的宏MSGMAX给出消息队列的最大长度)
》msqid_ds内核数据结构(保存着消息队列当前的状态信息)
》ipc_perm内核数据结构(保存着消息队列的一些重要信息,如消息队列关联的的键值,消息队列的用户ID,组ID)
B、消息队列的创建:ftok(),消息队列是随着内核的存在而存在,每个消息对列在系统范围内对应唯一的键值。要获得消息队列的描述符,只需提供该消息队列的键值即可,而改建值则是有ftok返回,ftok通过pathname(在系统中要存在且进程具有访问权)和proj_id(1~255)这两个参数生成唯一的键值。
C、写消息队列
通过msgsnd实现向消息队列写数据
D、读消息队列
通过msgrcv()实现从消息队列中读取数据
E、获取和设置消息队列的属性
通过msgctl()来实现
4、信号量
临界资源:简单的理解就是只能由一个进程或线程进行操作的资源,这里的资源可以是一段代码,一个变量或某种硬件资源。信号量大于或等于0时表示可并发进程使用的资源实体;小于0时代表正在等待使用临界资源的进程数。
A、通过调用系统函数semget实现信号集的创建和打开。
B、信号量的操作
信号量的值与相应资源的使用情况有关,当他的值大于0时,表示当前可用资源的数量,当他的值小于0时,其绝对值表示等待使用该资源的进程个数。
信号量的值仅能由PV操作来执行,而PV操作通过调用semop函数来实现。
C、信号集的控制
通过函数semctl来实现对信号集的控制(如对信号集的删除,设置等)
5、共享内存
其含义就是分配一块能被其他进程访问的内存。
通过shmget(linux/shm.h)来创建一个共享内存区,或者访问一个已经存在的共享内存区 。
6、库的创建和使用
库是一种软件组件技术,库里面封装了数据和函数,提供给用户程序使用。Windows系统中包括静态链接库(.lib文件)和动态链接库(.dll文件),而linux系统中通常把库文件放在/usr/lib或/lib目录下。linux下的库文件名由前缀lib、库名和后缀3部分组成,其动态库以.so作为后缀,而静态库通常以.a作为后缀。
静态库和动态库的的载入顺序是不一样的,静态库的代码在编译时就拷贝到应用程序中,因此当多个应用程序同时引用一个静态库函数时,内存中将会有调用函数的多个副本,这样的优点是节约编译时间。而动态库是在程序开始运行后调用库函数时才被载入,被调函数在内存中只有一个副本,并且动态库可以在程序运行期间释放动态库所占的内存,腾出的空间供其他程序所使用。
阅读(776) | 评论(0) | 转发(0) |