进程间通信Linux中管道的创建和读写pipeLinux中命名.ppt
《进程间通信Linux中管道的创建和读写pipeLinux中命名.ppt》由会员分享,可在线阅读,更多相关《进程间通信Linux中管道的创建和读写pipeLinux中命名.ppt(55页珍藏版)》请在三一办公上搜索。
1、进程间通信 Linux中管道的创建和读写(pipe)Linux中命名管道的创建和读写(fifo)Linux中信号的使用(signal)Linux中信号量的使用(semaphore)Linux中共享内存的使用(shm)Linux中消息队列的使用(message),Linux下进程间通信概述 管道 信号 信号量 共享内存消息队列实验,Linux下进程间通信概述,进程间通信方式的种类(1),(1)管道(Pipe)及命名管道(named pipe,FIFO):管道可用于具有亲缘关系进程间的通信;命名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。(2)信号(Signal):信号是在软件
2、层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的。(3)消息队列(Message Queue):消息队列是消息的链表,包括POSIX消息队列和SystemV消息队列。它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息;对消息队列有读权限的进程则可以从消息队列中读取消息。,进程间通信方式的种类(2),(4)共享内存(Shared memory):可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存
3、中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。(5)信号量(Semaphore):主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段。(6)套接字(Socket):这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。,2 管道,管道概述,管道(pipe)是Linux中进程间通信的一种方式。它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。它是一个半双工的通信模式,具有固定的读端和写端。管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read()和write()等函数。但是它不是普通的文件,并不
4、属于其他任何文件系统,并且只存在于内核的内存空间中。,管道的创建 和关闭,管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fd0和fd1,其中fd0固定用于读管道,而fd1固定用于写管道,这样就构成了一个半双工的通道。创建管道可以通过调用pipe()来实现。管道关闭时只需使用普通的close()函数逐个关闭各个文件描述符。,父子进程之间的管道通信(1),用pipe()函数创建的管道两端处于一个进程中,由于管道是主要用于在不同进程间通信的,因此这在实际应用中没有太大意义。实际上,通常先是创建一个管道,再通过fork()函数创建一子进程,该子进程会继承父进程所创建的管道。,
5、父子进程之间的管道通信(2),父子进程分别拥有自己的读写通道,为了实现父子进程之间的读写,只需把无关的读端或写端的文件描述符关闭即可。此时,父子进程之间就建立起了一条“子进程写入,父进程读取”的通道。,标准流管道(1),与Linux的文件操作中有基于文件流的标准I/O操作一样,管道的操作也支持基于文件流的模式。这种基于文件流的管道主要是用来创建一个连接到另一个进程的管道,这里的“另一个进程”也就是一个可以进行一定操作的可执行文件,例如,用户执行“ls-l”或者自己编写的程序“./pipe”等。由于这一类操作很常用,因此标准流管道就将一系列的创建过程合并到一个函数popen()中完成。它所完成的
6、工作有以下几步。创建一个管道。fork()一个子进程。在父子进程中关闭不需要的文件描述符。执行exec函数族调用。执行函数中所指定的命令。,标准流管道(2),标准流管道的使用可以大大减少代码的编写量,但同时也有一些不利之处,例如,它不如前面管道创建的函数那样灵活多样,并且用popen()创建的管道必须使用标准I/O函数进行操作,但不能使用前面的read()、write()一类不带缓冲的I/O函数。与之相对应,关闭用popen()创建的流管道必须使用函数pclose()来关闭该管道流。该函数关闭标准I/O流,并等待命令执行结束。,标准流管道(3),命名管道(1),前面介绍的管道是无名管道,它只能
7、用于具有亲缘关系的进程之间,这就大大地限制了管道的使用。命名管道的出现突破了这种限制,它可以使互不相关的两个进程实现彼此通信。该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当作普通文件一样进行读写操作,使用非常方便。不过值得注意的是,FIFO是严格地遵循先进先出规则的,对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾,它们不支持如lseek()等文件定位操作。命名管道的创建可以使用函数mkfifo(),该函数类似文件中的open()操作,可以指定管道的路径和打开的模式。,命名管道(2),在创建管道成功之后,就可以使用open()
8、、read()和write()这些函数了。与普通文件的开发设置一样,对于为读而打开的管道可在open()中设置O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY,在这里与普通文件不同的是阻塞问题。,命名管道(3),由于普通文件的读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open()函数中设定为O_NONBLOCK。对于读进程 若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数将立刻返回0。对
9、于写进程 若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。,3 信号,信号概述(1),信号是UNIX中所使用的进程通信的一种最古老的方法。它是在软件层次上对中断机制的一种模拟,是一种异步通信方式。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一进程,而无需知道该进程的状态。如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它为止;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时
10、才被传递给进程。不可靠信号和可靠信号,信号概述(2),一个不可靠信号的处理过程是这样的:如果发现该信号已经在进程中注册,那么就忽略该信号。因此,若前一个信号还未注销又产生了相同的信号就会产生信号丢失。而当可靠信号发送给一个进程时,不管该信号是否已经在进程中注册,都会被再注册一次,因此信号就不会丢失。所有可靠信号都支持排队,而所有不可靠信号都不支持排队。一个完整的信号生命周期可以分为3个重要阶段,这3个阶段由4个重要事件来刻画的:信号产生、信号在进程中注册、信号在进程中注销、执行信号处理函数,信号概述(3),用户进程对信号的响应可以有3种方式。忽略信号,即对信号不做任何处理,但是有两个信号不能忽
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 通信 Linux 管道 创建 读写 pipeLinux 命名
链接地址:https://www.31ppt.com/p-5674732.html