




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 协同进程理解过滤程序:UNIX系统过滤程序从标准输入读取数据,对其进行适当处理后写到标准输出。几个过滤程序通常在shell管道命令行中线性的连接。当一个程序产生某个过滤程序的输入,同时又读取该过滤程序的输出时,则该过滤程序就成为协同进程。管道就是协同进程的例子:父进程产生子进程的输入,子进程(也就是过滤程序)处理好数据,输入到父进程,子进程即为父进程的协同进程。本质上还是管道的东东2、 标准输入输出重定向问题dup(),dup2()dup是复制的缩写,便于理解个人简单理解:标准输入输出重定向问题实质是把原来从键盘的标准输入和屏幕的标准输出变为从文件的输入到文件的输出。dup2(fd,stdout)如原来标准输出“Hello”的话,现在意味着“Hello”将重定向输出到fd文件中#include int dup( int oldfd ); int dup2( int oldfd, int targetfd )功能:dup和dup2是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr(用数字表示即为0,1,2)。#include int dup( int oldfd );功能:函数dup,我们可以复制一个描述符。传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。这意味着,这两个描述符共享同一个数据结构。例如,如果我们对一个文件描述符执行lseek操作,得到的第一个文件的位置和第二个是一样的。实例:int fd1, fd2; . fd2 = dup( fd1 );需要注意的是,我们可以在调用fork之前建立一个描述符,这与调用dup建立描述符的效果是一样的,子进程也同样会收到一个复制出来的描述符。 #include int dup2( int oldfd, int targetfd )dup2函数跟dup函数相似,但dup2函数允许调用者规定一个有效描述符和目标描述符的id。dup2函数成功返回时,目标描述符(dup2函数的第二个参数)将变成源描述符(dup2函数的第一个参数)的复制品,换句话说,两个文件描述符现在都指向同一个文件,并且是函数第一个参数指向的文件。下面我们用一段代码加以说明: 实例: int oldfd; oldfd = open(app_log, (O_RDWR | O_CREATE), 0644 ); dup2( oldfd, 1 ); close( oldfd );本例中,我们打开了一个新文件,称为“app_log”,并收到一个文件描述符,该描述符叫做fd1。我们调用dup2函数,参数为oldfd和1,这会导致用我们新打开的文件描述符替换掉由1代表的文件描述符(即stdout,因为标准输出文件的id为1)。任何写到stdout的东西,现在都将改为写入名为“app_log”的文件中。需要注意的是,dup2函数在复制了oldfd之后,会立即将其关闭,但不会关掉新近打开的文件描述符,因为文件描述符1现在也指向它。 示例代码3:利用C实现命令的流水线操作的代码 1: #include 2: #include 3: #include 4: 5: int main() 6: . 7: int pfds2; 8: 9: if ( pipe(pfds) = 0 ) . /建立一个管道 10: 11: if ( fork() = 0 ) . /子进程 12: 13: close(1); /关闭stdout描述符 14: dup2( pfds1, 1 ); /把stdout重定向到管道(pfds1) 15: close( pfds0 ); /关掉管道的输入端 16: execlp( ls, ls, -1, NULL ); /把子进程的映像替换为命令ls 1的进程映像 17: 18: else . /父进程 19: 20: close(0); /关闭stdin描述符 21: dup2( pfds0, 0 ); /让stdin变成管道的输出端 22: close( pfds1 ); /关闭管道的stdout端(pfds1) 23: execlp( wc, wc, -l, NULL ); /把父进程的映像替换为命令wc -1的进程映像 24: 25: 26: 27: 28: 29: return 0; 30: 代码说明:管道的接收端和管道的输入端两个角度分析:第9行代码中建立一个管道,然后将应用程序分成两个进程:一个子进程(第1316行)和一个父进程(第2023行)。接下来,在子进程中首先关闭stdout描述符(第13行),然后提供了ls 1命令功能,不过它不是写到stdout(第13行),而是写到我们建立的管道的输入端,这是通过dup函数来完成重定向的。在第14行,使用dup2 函数把stdout重定向到管道(pfds1)。之后,马上关掉管道的输入端。然后,使用execlp函数把子进程的映像替换为命令ls 1的进程映像,一旦该命令执行,它的任何输出都将发给管道的输入端。 现在来研究一下管道的接收端。从代码中可以看出,管道的接收端是由父进程来担当的。首先关闭stdin描述符(第20行),因为我们不会从机器的键盘等标准设备文件来接收数据的输入,而是从其它程序的输出中接收数据。然后,再一次用到dup2函数(第21行),让stdin变成管道的输出端,这是通过让文件描
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年潮玩消费市场深度解读:收藏价值与文化传承研究
- 2025年家庭教育指导服务市场细分产品供给与需求匹配研究报告
- 2025年生鲜新零售市场供应链优化与冷链物流效率提升报告
- 河北省昌黎县靖安学区2021-2022学年五年级上学期科学期中试卷(含答案)
- 民法典物权法课件
- 2025年造价工程师考试冲刺押题卷-工程造价计算与招标投标专项训练
- 2025年Python二级考试专项训练试卷 知识点押题精讲版
- 现代化衣柜知识培训内容课件
- 2025年公务员考试行测数量关系全真试卷 高频考点冲刺押题
- 2025年高考英语词汇短语专项训练试卷
- 2024年国药控股股份有限公司招聘笔试冲刺题(带答案解析)
- “新高考、新课标、新教材”背景下2025届高考地理二轮三轮复习备考策略
- 葡萄糖耐量试验课件
- 常见泌尿系统疾病的护理与治疗
- 儿童读写三十讲
- 可编程控制器系统应用编程(1+X)培训考试题库汇总(附答案)
- 不等式及其基本性质说课课件
- 肺切除术后支气管胸膜瘘处理策略
- 中国有色金属行业:决战元素周期表-20210810-海通国际-201正式版
- 00052管理系统中计算机应用(实践)考试题目
- 人教版七年级英语上册单词带音标(WORD)
评论
0/150
提交评论