Linu原理及应用03.ppt

  1. 1、本文档共94页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linu原理及应用03

* 管道的读 当进程从管道读数据时,同样会有两种情况: 管道中有足够的数据供进程读。此时,进程便从读指针所指位置开始读数据,每读出一个数据块后,便增加地址项的大小。读操作结束后,核心修改索引节点中的读指针,并唤醒所有睡眠的写进程。 进程要读的数据比管道中的数据多。此时,读进程将返回管道中当前所有的数据。如果管道为空,进程一般将进入睡眠,直到一个写进程将数据写入管道,再将读进程唤醒。 管道的写 进程向管道写数据时,可能有以下两种情况: 管道中有足够的空间存放要写的数据,此时每写一数据块后核心便自动增加地址项的大小。写操作完成后,核心修改索引节点中的写指针,并唤醒所有因该管道空而睡眠等待的读进程。 管道中无足够的空间存放要写入的数据,此时核心对该索引节点作标记后让写进程睡眠,等待数据从管道中排出。上述情况的一个例外是,当进程写的数据量大于管道的容量时,核心将尽可能多的数据写到管道中,然后使进程睡眠,直到获得更多的空间。 与读反向 管道应用 一般的Linux shell程序都允许重定向。如 $ ls | pr | lpr?在这个管道应用中,ls列当前目录的输出被作为标准输入送到pr程序中,而pr的输出又被作为标准输入送到lpr程序中。管道是单向的字节流,它将某个进程的标准输出连接到另外进程的标准输入。但是使用管道的进程都不会意识到重定向的存在,并且其执行结果也不会有什么不同。shell程序负责在进程间建立临时的管道。 管道应用 无名管道:ls|wc 只存在于内存中 由pipes()创建 只限于有家族关系的进程之间 有名管道:和无名管道功能相同,只是不是内存文件,而是永久性的文件,外存文件。ls -l列出的p文件 有mknod创建(或mkfifo命令)管道文件 由两个进程调用open同时打开一个管道文件,然后分别调用read,write 任何两个进程之间都可以 进程1 写 进程2 读 内存文件 首先介绍如何使用man命令 SYSTEM Ⅴ进程间通信 进程在核心的协调下进行相互间的通信。Linux支持大量进程间通信(IPC)机制。除了信号和管道外,Linux 还支持Unix系统V中的IPC机制。 进程运行在各自的虚拟空间中,不能进行直接访问,只能通过系统提供的进程间通信机制(IPC)来完成。 SYSTEM Ⅴ的进程间通信包括: 信号量:用于进程同步控制 消息队列:用于进程间传递格式化数据 共享内存:通过多个进程共同访问一块存储区来实现通信 思考:三种IPC的相同点和不同点 IPC对象的Linux数据结构 系统中所有系统V IPC对象的Linux数据结构包含一个ipc_perm结构,它含有: IPC对象键 资源拥有者和创建者的标识号 存取权限 键值用来定位系统V IPC对象的引用标识。 消息队列 Linux维护一个消息队列链表,其中每个元素指向一个描述消息队列的msqid_ds结构。 每个msqid_ds结构包含: ipc_perm结构 消息队列的头尾指针 消息最后发送、接收及修改时间 读、写两个等待队列 消息数目、字节数等 系统V IPC消息队列数据结构 消息的发送 系统调用msgsnd( )向指定的消息队列发送一个消息。 每当进程试图发送消息时,系统将把其有效用户和组标识符与此队列的ipc_perm结构中的存取权限进行比较。如果允许则把此消息从该进程的地址空间拷贝到msg数据结构中,并放置到此消息队列尾部。 由于 Linux严格限制可写入消息的个数和长度,队列中可能容纳不下这个消息。此时,该进程将被添加到这个消息队列的等待队列中,同时系统选择新进程运行。当有消息从此队列中释放时,该进程将被唤醒。 消息的接收 系统调用msgrcv( ) 从指定消息队列中接收指定类型的消息。 接收进程将选择队列中第一个消息(不管是什么类型)或者第一个某特定类型的消息。如果没有消息可以满足此要求,该进程将被添加到消息队列的读等待队列中,然后系统选择新进程运行。当有新消息写入队列时,进程将被唤醒继续执行。 信号量 每个系统V IPC信号量对象对应一个信号量数组,Linux使用semid_ds结构来表示。 每个semid_ds结构包含: ipc_perm结构 信号量数目sem_nsems 信号量的最后操作时间及修改时间 指向第一个信号量的指针 信号量等待队列 UNDO队列 系统V IPC信号数据结构 信号量的操作 系统调用semop( ) 对信号量数组进行操作。该系统调用可以定义许多种操作,每个操作用三个输入来描述: 信号量索引:指出操作信号量在数组中的索引 操作值:将被加到信号量上的数值 操作标志:表示进程是否等待、是否作undo操作等 信号量的操作(续) 核心根据操作值来改变信号量的值,可分三种情况: 值为正:则将其值加到信号量的值上,并唤醒所

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档