




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章进程间通信 管道 2 主要内容 管道的定义popen和pclose库函数pipe系统调用父进程和子进程命名管道 FIFO客户 服务器架构 3 什么是管道 管道 pipe Shell中的管道机制e g cmd1 cmd2管道是半双工 而且一般是传送方向固定的单向管道管道也是一种文件管道不允许文件定位 读从文件的开始处读 数据在管道中是以先进先出的方式传送 4 popen pclose函数 标准I O库为实现两个进程之间传递数据提供了两个函数popen和pclose includeFILE popen constchar command constchar open mode intpclose FILE stream to close 5 intmain FILE read fp charbuffer BUFSIZ 1 intchars read memset buffer 0 sizeof buffer read fp popen uname a r if read fp NULL chars read fread buffer sizeof char BUFSIZ read fp if chars read 0 printf Outputwas n s n buffer pclose read fp exit EXIT SUCCESS exit EXIT FAILURE 通过管道读取数据 6 将输出送往popen intmain FILE write fp charbuffer BUFSIZ 1 sprintf buffer Onceuponatime therewas n write fp popen od c w if write fp NULL fwrite buffer sizeof char strlen buffer write fp pclose write fp exit EXIT SUCCESS exit EXIT FAILURE 7 popen函数分析 一方面shell对所有命令参数进行扩展处理 用popen可以启动复杂的shell命令 另一方面 使用shell导致popen实际上派生了两个子进程 占用了较多的系统资源 8 pipe系统调用 pipe函数 创建一个管道 提供对读写数据更多的控制 includeintpipe intfiledes 2 Returnedvalue 0ifsuccess 1iffailure pipe FIFO filedes用来保存标识管道的文件描述符 filedes 0 用来从管道读出数据 filedes 1 用来向管道写入数据 9 单个进程的pipe 10 include include defineMSGSIZE16char msg1 hello world 1 char msg2 hello world 2 char msg3 hello world 3 main charinbuf MSGSIZE intp 2 j if pipe p 1 perror pipecall exit 1 11 write p 1 msg1 MSGSIZE write p 1 msg2 MSGSIZE write p 1 msg3 MSGSIZE for j 0 j 3 j read p 0 inbuf MSGSIZE printf s n inbuf exit 0 12 父子进程间管道通信 13 管道和exec函数 intmain intdata processed intfile pipes 2 constcharsome data 123 charbuffer BUFSIZ 1 pid tfork result memset buffer 0 sizeof buffer if pipe file pipes 0 fork result fork if fork result pid t 1 fprintf stderr Forkfailure exit EXIT FAILURE if fork result 0 sprintf buffer d file pipes 0 void execl pipe4 pipe4 buffer char 0 exit EXIT FAILURE else data processed write file pipes 1 some data strlen some data printf d wrote dbytes n getpid data processed exit EXIT SUCCESS 14 pipe4 c intmain intargc char argv intdata processed charbuffer BUFSIZ 1 intfile descriptor memset buffer 0 sizeof buffer sscanf argv 1 d 15 piperead write 写管道时 常数PIPE BUF规定了内核中管道缓存器的大小当没有数据可读时 read调用阻塞 管道的一端关闭时 写端关闭 读该管道在所有数据都被读取后 read返回0 表示达到了文件结束读端关闭 写该管道产生信号SIGPIPE 16 管道用于标准输入和标准输出 可以把其中一个管道文件描述符设置为一个已知值 一般是标准输入0或标准输出1 用dup dup2 函数和close函数对文件描述符进行处理 includeintdup intfile descriptor intdup2 intfile descriptor one file descriptor two 17 18 if pipe file pipes 0 fork result fork if fork result pid t 1 fprintf stderr Forkfailure exit EXIT FAILURE if fork result pid t 0 close 0 dup file pipes 0 close file pipes 0 close file pipes 1 execlp od od c char 0 exit EXIT FAILURE else close file pipes 0 data processed write file pipes 1 some data strlen some data 管道和dup函数 19 FIFO 命名管道 管道和命名管道相同点进程间传送数据 也是半双工方式 数据处理基于FIFO不同点命名管道作为一种特殊文件纳入文件系统 和一般文件一样有名字 在文件系统的目录树中有命名管道的目录项 磁盘上有其对应的inode节点管道一般只用于父子进程之间的通信 命名管道应用范围更广 mkfifo 1 mkfifo 2 mknod 1 mknod 2 20 创建FIFO mkfifo 创建命名管道 include includeintmkfifo constchar filename mode tmode Returnedvalue 0ifsuccess 1iffailure 21 创建命名管道 intmain intres mkfifo tmp my fifo 0777 if res 0 printf FIFOcreated n exit EXIT SUCCESS 22 用open打开一个FIFO Review open 系统调用intopen constchar pathname intflags flags parameter必须指定的互斥模式 O RDONLY O WRONLYO NONBLOCKconsideration 同步读端 写端 23 FIFO的同步 打开FIFO时的同步一般情况下 没有说明O NONBLOCK 只读打开要阻塞到某个其它进程为写打开此FIFO 类似的 为写打开一个FIFO要阻塞到某个其它进程为读而打开它 如果指定了O NONBLOCK 则只读打开立即返回 只写打开也立即返回 但如果没有进程已经为读而打开此FIFO 那么open将出错返回 1 errno置为ENXIO 24 同步示例 shell中使用fifo的例子catmy fifofifo2 c 25 for i 1 i argc i if strncmp argv O RDONLY 8 0 open mode O RDONLY if strncmp argv O WRONLY 8 0 open mode O WRONLY if strncmp argv O NONBLOCK 10 0 open mode O NONBLOCK printf Process dopeningFIFO n getpid res open FIFO NAME open mode printf Process dresult d n getpid res sleep 5 fifo2 c 26 27 读写FIFO 读写操作的行为受FIFO打开标志O NONBLOCK的影响 1 对一个空的 阻塞的read调用将阻塞 直至有数据可以读时才继续执行 对一个空的 非阻塞的FIFO的调用将立刻返回0字节 2 对于设置了阻塞标志的写操作 当要写入的数据量不大于PIPE BUF时 linux将保证写入的原子性 如果此时管道空闲缓冲区不足以容纳要写入的字节数 则进入睡眠 直到当缓冲区中能够容纳要写入的字节数时 才开始进行一次性写操作 28 读写FIFO 当要写入的数据量大于PIPE BUF时 linux将不再保证写入的原子性 FIFO缓冲区一有空闲区域 写进程就会试图向管道写入数据 写操作在写完所有请求写的数据后返回 对于没有设置阻塞标志的写操作 当要写入的数据量大于PIPE BUF时 linux将不再保证写入的原子性 在写满所有FIFO空闲缓冲区后 写操作返回 当要写入的数据量不大于PIPE BUF时 linux将保证写入的原子性 如果当前FIFO空闲缓冲区能够容纳请求写入的字节数 写完后成功返回 如果当前FIFO空闲缓冲区不能够容纳请求写入的字节数 则返回EAGAIN错误 提醒以后再写 29 FIFO的应用 1 生产者消费者程序例fifo 4 30 生产者程序 intopen mode O WRONLY printf Process dopeningFIFOO WRONLY n getpid pipe fd open FIFO NAME open mode printf Process dresult d n getpid pipe fd if pipe fd 1 while bytes sent TEN MEG res write pipe fd buffer BUFFER SIZE if res 1 fprintf stderr Writeerroronpipe n exit EXIT FAILURE bytes sent res void close pipe fd 31 消费者程序 intopen mode O RDONLY getpid pipe fd open FIFO NAME open mode printf Process dresult d n getpid pipe fd if pipe fd 1 do res read pipe fd buffer BUFFER SIZE bytes read res while res 0 void close pipe fd 32 FIFO的应用 2 C S应用程序例 client c server c 需要解决以下3个问题 客户程序需要知道使用哪一个FIFO文件向服务器进程提出请求 服务进程需要知道通过那一个FIFO文件发送给客户的回答消息 在有多个客户进程写同一个FIFO的情况下 服务进程要能够区分所读的数据是谁发送的 33 client h defineSERVER FIFO NAME tmp serv fifo defineCLIENT FIFO NAME tmp cli d fifo defineBUFFER SIZE20structdata to pass st pid tclient pid charsome data BUFFER SIZE 1 34 server c mkfifo SERVER FIFO NAME 0777 server fifo fd open SERVER FIFO NAME O RDONLY sleep 10 do read res read server fifo fd 35 server c 续 while tmp char ptr tmp char ptr toupper tmp char ptr tmp char ptr sprintf client fifo CLIENT FIFO NAME my data client pid client fifo fd open client fifo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年财会类中级经济师中级经济基础-中级人力资源管理参考题库含答案解析(5套试卷)
- 2025年度高效特种叉车租赁及操作技能提升培训服务协议
- 2025年度离婚协议修订:婚姻解除、财产分割及子女抚养新条款
- 2025年学历类高职单招-旅游类(中职)参考题库含答案解析(5套试卷)
- 2025年企业试用期员工合同范本及管理技巧分享手册
- 2025年房产财产保险保单质押借款服务协议书
- 2025年节能型办公楼租赁合同范本与环保技术应用协议
- 2025年企业财务报告编制及数据安全保密协议
- 2025年度农业项目季节性临时用工服务合同模板
- 2025年智能自动门产品定制与全球市场推广服务合同
- 《现代物流管理》第一章-导论(课用)
- 体育产业经营管理课件第一章导论
- 智能制造生产线运营与维护课件完整版
- 2023门球竞赛规则电子版图文并茂
- 树木清障专项施工方案
- 内部审计-内部审计准则完整版-中国内部审计准则体系
- 《爱的教育》读书分享读书分享2
- 合伙经营教育培训机构合同经典版
- 体适能评定理论与方法实验指导
- 配网工程管理流程及注意事项
- PTB220串行数字气压计用户手册
评论
0/150
提交评论