1Linux进程间通信2进程间通信发展历程最初UNIX的进程间通信基于Socket进程间通信基于SystemV进程间通信POSIX进程间通信Linux进程间通信3信号操作系统通过信号向进程发送异步事件信号。当一个事件发生时,如果需要通知进程,则系统就为其生成一个信号,进程在接受到信号后,可采取适当动作来处理信号。在linux系统中,内核用一个字代表所有信号,信号种类的树目和具体平台有关,如32位、64位。信号是内核不可分割的一部分,不象其他ipc,是可选的。进程通信机制4进程对信号的操作•忽略信号•阻塞信号•由进程处理信号•由内核进行默认处理进程通信机制5管道(pipe)有名管道一般为系统特殊文件方式,使用的进程之间不一定要有父子关系或兄弟关系.无名管道一般为内存方式,使用的进程之间一定要有父子关系或兄弟关系.无名管道实现方法两个file数据结构指向同一个临时VFSINODE节点(本身指向内存中的一个物理页)实现。进程通信机制6进程通信机制•消息队列:消息队列是消息的链接表,包括Posix消息队列systemV消息队列。它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读取消息。7进程通信机制•共享内存:可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。8进程通信机制•信号量:主要作为进程间以及同一进程不同线程之间的同步手段。•套接字(Socket):这是一种更为一般的进程间通信机制,它可用于不同机器之间的进程间通信,应用非常广泛。9管道通信•管道是Linux中进程间通信的一种方式。这里所说的管道主要指无名管道,它具有如下特点。•它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。•它是一个半双工的通信模式,具有固定的读端和写端。•管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。10管道创建与关闭写读内核管道用户进程fd[0]fd[1]11管道创建与关闭•管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fds[0]和fds[1],其中fds[0]固定用于读管道,而fd[1]固定用于写管道,如图8.3所示,这样就构成了一个半双工的通道。12管道创建函数所需头文件#includeunistd.h函数原型intpipe(intfd[2])函数传入值fd[2]:管道的两个文件描述符,之后就可以直接操作这两个文件描述符函数返回值成功:0出错:113管道创建实例•pipe.c•创建管道可以通过调用pipe来实现。14管道读写父进程fd[0]fd[1]子进程fd[0]fd[1]内核管道15管道读写父进程fd[0]fd[1]子进程fd[0]fd[1]内核管道16管道读写实例•pipe_rw.c•在本例中,首先创建管道,之后父进程使用fork函数创建子进程,之后通过关闭父进程的读描述符和子进程的写描述符,建立起它们之间的管道通信。