linux进程间通讯.ppt
《linux进程间通讯.ppt》由会员分享,可在线阅读,更多相关《linux进程间通讯.ppt(22页珍藏版)》请在三一办公上搜索。
1、Linux进程间通讯,目录,Linux IPC概述信号(signal)信号量(semaphore)消息 队 列命名管道共享内存套接字,Linux IPC概述,信号(signal):亲缘进程和非亲缘进程都可以,也可以进程自己给自己递送信号。信号量(semaphore):主要是线程间和亲缘进程间的同步手段,不做数据传输之用。消息 队 列:就是一个消息的链表。就是把消息看作一个记录,并且这个记录具有特定的格式以及特定的优先级。管道:只允许亲缘进程间的通讯。命名管道(FIFO):除了亲缘进程可以通讯外,非亲缘进程也可以通讯。共享内存:多个进程可以访问同一块内存空间,是最快的IPC方式。在进程间传递数据
2、时无须任何内存的拷贝。套接字:最通用的进程间通讯方式,它提供了一种让不同机器上进程间通讯方式。,信号(signal),信号(signal)是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号)。应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉。进程收到一个信号后,会检查对该信号的处理机制。如果是SIG_IGN,就忽略该信号;如果是SIG_DFT,则会采用系统默认的处理动作,通常是终止进程或忽略该信号;如果给该信号指定了一个处理函数(捕捉),则会中断当前进程正在执行的任务,转而去执行该信号的处理函数,返回后再继续执行被中断的任务。,
3、简单signal函数,typedef void(*sighandler_t)(int)sighandler_t signal(int signum,sighandler_t handler);返回原信号处理函数,或SIG_ERR signal()是最简单的给进程安装信号处理器的函数,第一个参 数指定信号,第二个参数为该信号指定一个处理函数。信号屏蔽字(process signal mask)每个进程都会有一个信号屏蔽字,它规定了当前进程要阻塞的信号集。对于每种可能的信号,信号屏蔽字中都会有一位与之对应,如果该位被设置,该信号当前就是阻塞的。进程可以通过sigprocmask()来获得和修改当前
4、进程的信号屏蔽字。,信号集(signal set),信号集是一种特殊的数据类型,由于无法确定信号的多少,所以不能用简单数据类型来包含所有可能的信号,所以系统就定义了一个sigset_t的数据类型专门用于信号集。同时还定义了一族用于处理信号集的函数。这样用户可以不必关心信号集的实现,只要使用这组函数来处理信号集就可以了。信号集函数 int sigemptyset(sigset_t*set);int sigfillset(sigset_t*set);int sigaddset(sigset_t*set,int signum);int sigdelset(sigset_t*set,int signu
5、m);int sigismember(sigset_t*set,int signum);sigemptyset()和sigfillset()都用于初始化一个信号集,前者用于清空信号集中所有的信号,后者则用于设置信号集中所有的信号;信号集在使用前必须要经过初始化,初始化后,就可以用sigaddset()和sigdelset()往信号集里添加删除信号了。sigismember()用于判断指定信号是否在信号集中。,信号量(semaphore),信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公共资源增加时,调用函数sem_post()增加信号量。只有当信号量值大于时,才能使用公共
6、资源,使用后,函数sem_wait()减少信号量。函数sem_trywait()和函数pthread_ mutex_trylock()起同样的作用,它是函数sem_wait()的非阻塞版本。它们都在头文件/usr/include/semaphore.h中定义。信号量的数据类型为结构sem_t,它本质上是一个长整型的数。函数sem_init()用来初始化一个信号量。它的原型为:extern int sem_init _P(sem_t*_sem,int _pshared,unsigned int _value);sem为指向信号量结构的一个指针;pshared不为时此信号量在进程间共享,否则只能为
7、当前进程的所有线程共享;value给出了信号量的初始值。函数sem_post(sem_t*sem)用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。函数sem_wait(sem_t*sem)被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。函数sem_trywait(sem_t*sem)是函数sem_wait()的非阻塞版本,它直接将信号量sem的值减一。函数sem_destroy(sem_t*sem)用来释放信号量sem。,消息 队 列,消息 队 列 就是一个消息的
8、链表。就是把消息看作一个记录,并且这个记录具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读出消息。消息 队 列 是随内核持续的并和进程相关,只有在内核重起或者显示删除一个消息队列时,该消息队列才会真正被侧除。因此系统中记录消息队列的数据结构(struct ipc_idsmsg ids)位于内核中,系统中的所有消息队列都可以在结构msg ids中找到访问入口。,消息 队 列 的编程接口(AP,(1)m s gge t:调用者提供一个消息队列的键标(用于表示一个消息队列的唯一名字),当这个消息队列存在的时候,这个消息
9、调用负责返回这个队列的标识号;如果这个队列不存在,就创建一个消息队列,然后返回这个消息队列的标识号,主要由sys msgge收行。(2)m s gsn d:向一个消息队列发送一个消息,主要由sys_msgsnd执行。(3)m s grc v:从一个消息队列中收到一个消息,主要由sys-m sgrcv执行。(4)m s gct l:在消息队列上执行指定的操作。根据参数的不同和权限的不同,可以执行检索、删除等的操作,主要由sys msgctl执行。,管道,#include int pipe(int pipefd2);pipe用来创建一个管道,这个管道用于父子进程间的通讯。pipefd0是管道的读端
10、,pipefd1是管道的写端。由于管道是单向的,所有一个进程需要关闭写端或者读端。写端不存在时,读端会收到文件结束符。读端不存在时,写端会收到SIGPIPE信号。成功返回0,失败返回-1.缺点:只能用于亲缘进程间通讯。,管道,管道是半双工的,当需要双向通讯时,需要两个管道。只能用于父子进程和兄弟进程等有亲缘关系的进程。数据写入时,放在管道的结尾。数据读取时,从管道的头开始读取。,f o r k之后做什么取决于我们想要有的数据流的方向。对于从父进程到子进程的管道,父进程关闭管道的读端(f d 0),子进程则关闭写端(f d 1),Fork后的半双工管道,从父进程到子进程的管道对于从子进程到父进程
11、的管道,父进程关闭fd1,子进程关闭fd0,命名管道(FIFO),命名管道可以在所有进程间使用,克服了管道只能在亲缘进程通讯的限制。命名管道与一个路径名相关联,以文件的形式存在于文件系统中。只要能访问该文件的进程就可以使用命名管道。命名管道也是先进先出,虽然以文件形式实现但不支持seek等操作。命名管道的数据并不是放在文件系统上。#include#include int mkfifo(const char*pathname,mode_t mode)第一个参数为路径名,第二个为创建类型。跟create函数的参数一样。进程只要打开这个文件,就可以往这个文件读和写。当多个进程往fifo里写时,lin
12、ux只保证PIPE_BUF大小的字节数是原子的。成功返回0,失败返回-1。,命名管道的使用,shell命令mkfifo可在文件系统中创建命名管道命名管道fifo使用跟文件类似open打开,read/write来读取数据当以只读方式打开fifo时,阻塞open要等到有进程打开写fifo,反之也一样fifo有容量上限,#include FILE*popen(const char*command,const char*type);int pclose(FILE*stream);popen的作用相当于创建一个管道,然后再fork一个子进程,最后执行命令。根据命令的不同这个管道是可读或者可写。Comma
13、nd参数是一个shell命令用popen打开的文件描述必须用pclose关闭失败返回NULL,共享内存,共享内存是操作系统把同一块物理内存映射到不同进程的地址空间。效率高,无须拷贝。多个进程可以自由读写共享内存,所以需要同步机制。mmap、shmget、shmat、shmdt、shmctl,void*mmap(void*start,size_t len,int prot,int flags,int fd,off_t offset)mmap在进程地址空间创建一个映射。它既可以把一个文件映射到内存,也可以映射一块内存,实现进程间内存共享。mmap函数从文件偏移为offset开始,长度length字
14、节的内容映射到进程空间。文件由fd表示映射进程空间的起始地址由start说明,但仅仅是一个提示不是必须。通常为0,让内核选择合适地址内存隐射大小以page为单位,而不是实际要求的字节数返回值为内存映射的起始地址。,prot描述了内存隐射的保护机制PROT_EXEC 页面可以被执行PROT_READ 页面可以读PROT_WRITE 页面可以写PROT_NONE 页面不能访问flags说明内存隐射的类型MAP_FIXED 隐射内存必须使用start指明的起始地址,地址必须以page对齐MAP_SHARED 隐射内存在亲缘进程间共享(exec执行前),如果是隐射文件,对内存的修改就是对文件的修改,但
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 进程 通讯
链接地址:https://www.31ppt.com/p-6511395.html