我发现3是很好的数字(大三下期末复习:软工/交换/Linux)

假如这是一部精致且庄重的典籍,扉页上必须说点什么以表感怀,那必然要:

献给我的牙、牙龈和腮帮子
它们多次在考试周拼命刷存在感

《现代交换原理》概念

本部分专注于概念,目标是糊弄选填判断小题和简答题(如有)

通信网组成的三要素是:终端设备、交换设备、传输设备
现代通信网的三大支撑网:No7信令网、数字同步网(就是管时钟同步的)、电信管理网TMN
信息传递三阶段:连接建立、传输信息、连接拆除。这是面向连接方式最显著的特征
交换网络三要素:交换单元、拓扑结构、控制方式。若干个交换单元按照一定的拓扑结构和控制方式构成的
交换网络的构成:控制子系统、信息传送子系统
交换的基本功能:在任意入线和出线之间建立连接
交换单元四个部分:入线、出线、控制端、状态端

  1. 五个常见交换单元连接方式:直接、交叉、间隔交叉、蝶式、均匀洗牌 (今年没考)
    • 交叉连接(低位反)E
    • 间隔交叉(K位反)Ck
    • 蝶式(高低位互换)β
    • 均匀洗牌(高移低)δ
  2. 基于banyan的多通路结构:增长、扩展、膨胀、复份(多平面) (今年没考)
    • 增长型(增加一级)
    • 扩展型(除了入线,其余线都变为两根,出线再用三角形收成一根)
    • 膨胀型(入线每根还是1根,过了一级就变成两根、再过一级变3根……直到出线变n+1根)
    • 多平面

我发现benes就是m=n的clos

  1. 数字程控电话交换系统的构成:话路子系统、控制子系统
    • 话路子系统包括:接口设备、交换网络
      • 三种接口分为:用户侧接口(V、Z)、中继侧接口(A、B、C)、操作维护接口(Q3)
        • 数字接口:V、A、B
        • 模拟接口:Z、C
      • 模拟用户电路功能:馈、过、振、监、编(也叫模数转换)、混、测、主叫号码显示、极性转换、计费脉冲
      • 数字中继电路功能:帧、帧、复、码(NRZ→HDB3)、时、提 (今年考了这个)
      • 交换网络:TST,nj+i,nv/8
    • 控制子系统的要求:1、BHCA最大忙时试呼次数(t=a+Nb,求N) 2、高可靠性
      • 三种控制子系统的控制方式:集中(可靠性差)、分级分散、全分散(可靠性好,易扩展)
        • 三种多处理机工作方式:功能分担、话务分担(负荷分担)、冗余
        • 三种双机冗余配置包含:同步方式、互助方式、主备方式

SDL中三种分级任务:故障级任务(最高优先级)、周期级任务、基本级任务(最低优先级)

LSP的组成:出入口LER、LSR、逻辑信道
三种标记分配方式:上游标记分配、下游自主标记分配、下游按需标记分配
标记分配过程:发现相邻LDP对等体、建立LDP会话、建立LSP
MPLS数据传输过程:入口路由器处理过程(3步)、核心路由器处理过程(1步)、出口路由器处理过程(2步)

信令是什么:通信网中规范化的控制命令
信令方式指的是:信令的结构形式、传送方式、控制方式。
三种传送方式:端到端(速度快但信令在多段上的类型必须相同)、逐段转发(慢但对线路要求低)、混合
三种控制方式:非互控(设备简单可靠性差)、半互控、全互控(慢、设备复杂、可靠性好)
No.7 是数字型公共信道系统, 64kbitps双向通道
No.7 协议栈:消息传递部分:MTP1、2、3,用户部分:TUP DUP ISUP
三种No.7 信令单元:MSU、LSSU、FISU,用LI(长度指示)字段区分
No.7 的TUP信令流程:IAM、ACM、ANC、通话、CBK、CLF、RLG
信令网的三个组成部分:信令点SP、信令转接点STP、信令链路
信令网路由选择原则:最短路径、负荷分担
我国三级信令网:HSTP、LSTP、SP

各个网元功能看表
如果让填5G网元,UE用户设备;(R)AN接入网;UPF 用户面功能(≈S/P-GW);AMF管理功能(≈MME);DN 数据网络 比如运营商服务、互联网接入和三方服务

  1. 智能网,呼叫控制和业务处理相分离

  2. NGN的初级阶段,软交换,呼叫控制和承载相分离

    • 软交换四层:业务层、控制层、传送层、接入层
    • 每层的设备举例:接入层:信令网关、媒体网关、接入网关、综合接入设备;传输层没有;控制层:软交换机;业务层:应用服务器
  3. NGN的中级阶段,IMS,呼叫控制和媒体控制相分离
    • IMS主要采用SIP协议,真正意义实现底层接入网技术无关,支持电路交换网络和分组交换网络上的一系列基于IP的业务,支持无线接入固定接入。比软交换的移动性好,存在多种CSCF实体(呼叫控制实体,包括I-CSCF、P-CSCF、S-CSCF)、MGCF(媒体控制实体)

SDN三个平面:应用层(APP)、控制层(SDN控制器)、转发层(网络设备)。是集中化的
三种接口:应用和控制之间是北向接口,控制和转发之间是南向接口(标准是openflow),网络设备之间的是东西向接口

北邮2024-2025《现代交换原理》期末考题回忆

  1. 小题,没看见原题
    • 选择,4G LTE网络控制面的网元有什么
  2. 大题
    • 总开销0.86,固定开销0.29,一次呼叫0.6ms,问BHCA是多少
    • 用最少的有向开关构造16*16可重排无阻塞网络。画出网络结构、交换单元的容量、所用的最少开关个数。(192个)
    • 给了一个具体场景,补全SDL图、SIP建立连接的消息流图,从SDP报文中分析主被叫是谁、协商的编码是多少、消息传递路径(不太会)
    • MPLS,经典题型。有一问问了一个下游按需分配方式的消息路径。
    • 移动交换,1)补全图中网元名称 2)给出概念,问叫什么。(切换、漫游、鉴权) 3)给出用途,问哪个网元是负责这个的 4)切换时,哪些网元参与了
    • SDN,给网络拓扑和每个交换机的流表,1)画出具体的转发路径,2)写出1)过程中流表的匹配、动作过程,3)如果没有匹配,那么接下来交换机的完整流程是什么

《软件工程》主线理解

需求分析

需求分析之前还有:系统分析、可行性分析(分析问题值不值得解决)
重要性:需求的不确定性会导致软件开发不同阶段不同角色对需求理解的偏差,只有清晰的描述和一致理解需求,最后造出来的软件才能被客户接收。
目标:准确的定义新系统的目标,回答系统必须“做什么”的问题,并编写需求规格说明书。
过程:当前系统→物理模型→逻辑模型→目标系统逻辑模型

面向对象需求分析(OOA)

  1. 用例

用例作用:发现系统的功能性需求,将系统功能放到用户角度去考虑,找到真正对用户有用的功能
用“用例”描述系统功能的好处:用户没看到系统之前很难想象他需要的系统有什么功能,但如果让用户讲他目前已有的工作流程是非常容易的。
用例建模的基本过程:1.系统边界 2.参与者 3.从参与者目标识别出用例
用例概念:描述参与者使用系统的一组成功场景和失败场景的集合

  1. 领域模型

概念:通过uml类图和活动图,针对某一特定领域内概念类或者对象的抽象可视化表示
作用:帮助开发人员短时间内正确理解用户业务领域的专业知识和关键流程
步骤:1.识别概念类 2.建立关系 3.设置属性

  1. 类图:依、关、聚、组、继
  • 依赖:A类是B类方法中的参数、A类是B类方法中的局部变量、B类调用了A类的静态方法
    • 虚线箭头从B指向A
  • 关联:类A是成员变量类B的成员变量
    • 实线、单向实现箭头(“导航”,从B指向A,被指的是东西)
    • 重数:1v1 1vn nv1
    • 关联类:比如考题生成规则、考核记录
  • 聚合:也是成员变量,那就需要通过语义来区分了
    • 空心菱形
  • 组合:能给成员变量赋初值
    • 实心菱形
  • 继承
    • 空心三角

面向对象设计(OOD)

  1. OOA和OOD的区别
    • OOA是对于真实世界中的问题、职责进行描述,不需要考虑怎么实现。用户角度。领域模型。概念类。
    • OOD需要考虑编程的实现。系统实现角度。设计模型。设计类。
  2. OOD是什么
    • 在OOA模型基础上运用面向对象方法进行系统设计,目标是产生一个符合具体实现条件的OOD模型
  3. OOD主要工作
    • 软件体系结构设计(必须在用例实现方案设计之前进行)
    • 用例实现方案设计
    • 用户界面设计(与其余两项没有必须的前后关系)(前两个是重点)
  4. OOD结果
    • 以uml包图等表示的软件体系结构
    • 以交互图和类图表示的用例实现
    • 针对复杂对象的状态图
    • 描述流程化处理过程的活动图
  5. 层次化设计:
    • 同一类放一起
  6. 软件分层的好处(软件体系结构设计中的内容)
    • 健壮性
    • 易于扩展和维护

原则:对某一划分出的层次进行修改时,只要接口不变,系统的其他部分应该不受影响,扩展维护可移植

  1. 包图描述层。本课学到了五层软件分层结构,松耦合架构,分别是:用户界面、控制器、业务逻辑、持久化、系统管理
    • 用户界面层:人机接口
    • 控制器层:并不进行任务处理,而是任务拆解和分发。实现了界面层和逻辑层的分离。控制器数量与用例数量相对应
    • 业务逻辑层:这里边的类来源于OOA的概念类。但二者有本质区别:领域模型的类,着眼于业务对象,不涉及对象的动作行为。只有属性没有方法。业务逻辑层的类需要通过消息交互共同完成用户发出的系统事件,因此不仅有属性也有方法。但好消息是OOA和OOD都用类和对象表示,所以只需要对领域模型的概念类增加方法即可得到设计模型的设计类。
    • 持久化层:引入的目的是,以防数据存储策略变化。变化之后,业务逻辑层不用动。
    • 系统层:非面向对象方式实现。软件与操作系统分离,增加应用的可移植性。绝不能调用其他层次的类,因为系统层是最底层。
  2. OOD七个基本原则(优秀经验)
    • 单一职责原则(一个类只包含一个对外功能,也就是只能有一个public方法),这样能提高类的内聚性。瑞士军刀和瑞士小刀
    • 开闭原则(对于功能可以扩展,但代码不能修改,这似乎是矛盾的,于是这条想说的就是依赖于抽象,使用封装技术进行封装)例如,有一个联系方式管理器类,依赖(就是依关聚组继的那个最弱的依赖)于phone类和email类,这是坏的,因为如果要扩展一个“传真”,那么联系方式管理器类的代码一定要被改的。正确做法是,令联系方式管理器依赖于一个抽象的父类,phone和email对继承自抽象类,那么就做到了“功能扩展而代码不改”的效果。
    • 里氏替换原则(父类对外提供的方法,子类必须能够提供,不然就不要贪图代码的复用而进行继承)橡皮鸭子不能继承真鸭子
    • 依赖倒置原则 (①高层模块不应依赖低层模块,二者都应依赖于抽象;②抽象不应依赖于具体,具体应依赖于抽象)翻译成人话的解释,是,①高层不要直接调用底层方法,声明一个接口,让低层去实现 ②跟开闭原则讲的一件事
    • 接口隔离原则:对不同的用户提供不同接口。客户冰糖要1,你因为客户雪梨要123,所以给冰糖也提供了123,这将产生负担。
    • 组合聚合复用原则(复用代码不要老想继承,这太暴露了,优先考虑作为成员变量(也就是组合聚合),这样信息还是隐藏的)
    • 迪米特原则(不要和陌生人说话,是信息隐藏原则的直接应用)熟人范围有五个。
  3. 设计用例实现方案(GRASP设计模式)

就是前面五个层次给出了框架,现在要往框架里填具体的对象是谁。包括“创建系统动态结构”、“创建系统静态结构”
设计类的来源:一个是前面说到的“概念类+方法”,这些最后都落到“业务逻辑层”;二是新增的,因为OOD考虑到“实现”这一步了,比如负责任务分发的类、负责持久化的类、负责通信的类是必不可少的,这些是之前在用户角度看不到的,这些类落到:用户界面层,控制器层,系统管理层,持久化层。
了解型职责,行为型职责

面向对象最关键的活动是正确的给对象分配职责。本课推荐基于设计模式的对象职责分配方法,也就是 GRASP设计模式

补充:

设计模式是什么?是软件开发经验的总结

GoF设计模式是什么?GoF是四个人,共同写了一本书《Design Patterns: Elements of Reusable Object-Oriented Software》,收录23种设计模式。后人用“GoF设计模式”指代这本书

本课中讲的GRASP设计模式与GoF有什么区别?GoF面向特定待解决的问题提供方法论,GRASP是基础,面向“面向对象设计”来告诉初学者怎样去设计

GRASP包含:
信息专家
创建者
控制器
(还有几个但考试大概只考察上面三个)

软件测试

侠义的软件测试是程序本身,现代的软件测试指的是为了发现软件中存在的错误,对软件开发过程中形成的各项输出进行检查。注意“各项输出”,包括了需求规格说明、概要设计说明……

那么软件生存期各个阶段需要测试的对象如图所示。

广义的软件测试分为:测试、确认、验证。

  1. 白盒测试之一:逻辑覆盖(6种)

以图片例子,分别把A>1,B=0,A=2,x/A>1记为1234。

图片描述

语句覆盖: 「保证每个矩形被执行过即可」
一个测试用例:
(1且2)真 且 (3或4)真
满足条件之一的情况是(1真,2真,3真) 即 A=2,B=0,x=4可以达到语句覆盖
(如果结果得出空集(我认为)就要调整了,下同)

判定覆盖 「每个菱形取过真和假即可」
两个测试用例:
(1且2)真 且 (3或4)真 即 A=2,B=0,x=4
(1且2)假 且 (3或4)假 即 A=-1,B=1,x=1

条件覆盖 「每个条件取过真和假即可」
两个测试用例:
1真 2真 3真 4真
1假 2假 3假 4假

判定-条件覆盖 「每个条件取过真和假,且每个菱形取过真和假」
两个测试用例:
1真 2真 3真 4真 -> ace
1假 2假 3假 4假 -> abd

条件组合 「把每个菱形内的条件都组合一遍,菱形之间的关系不用管」
1真 2真 3真 4真
1真 2假 3真 4假
1假 2真 3假 4真
1假 2假 3假 4假

路径测试 最强,含义:把所有可能的路径覆盖」
覆盖abd
覆盖abe
覆盖acd
覆盖ace

  1. 白盒测试之二:基本路径测试

理解一下就是逻辑覆盖中的路径测试真好啊,但是测不过来啊(考过给一个流程图,问多少条路)。那只好提取出一些有代表性的 基本 路径了

三种方式计算环路复杂度V(G)

  1. 黑盒测试法之等价类划分

  2. 软件测试过程(单、集、确、系、验)

单元测试:白盒为主,黑盒为辅;依据详细设计说明书;实施人是程序员
集成测试:组装。依据系统设计说明书。
确认测试:黑盒测试。依据需求规格说明书。也叫有效性测试,测试软件功能是否有效。也就是确认装完是飞机而不是风筝
系统测试:各种变态的压力测试,以及与环境适配。依据需求规格说明书。
验收测试:投入使用几个月后,走个流程,用户选择几个核心功能进行测试

北邮2024-2025《软件工程》期末考题回忆

四道简答题:
需求分析的活动有哪些?里程碑是什么?
操作契约的后置条件有哪些?有什么作用?
动态结构设计和静态结构设计的作用和关系。
黑盒测试中减少测试用例数量的办法有哪些?

四道大题:
根据抽象的描述画交互图
白盒测试,根据代码画控制流图、算VG、写基本路径
黑盒测试,画等价类表格
综合大题。

待到秋来九月八,我花开后百花杀
——黄巢《咏菊》

《Linux开发环境及应用》复习

第二章 文本文件处理、正则表达式

匹配字符串a[i]=b[j]*c[k],等号和星号两侧可以有空格

a\[i] *= *b\[j] *\* *c\[k]

如何匹配任一非中括号字符

[^][]

匹配一对中括号及其之内的东西(这对中括号内部不能有中括号)

\[[^][]*]

如何匹配空行(只有空格)

^ *

第三章 文件系统

find 三板斧:范围、条件、动作。

范围
一棵或多棵目录树

条件
-name 文件通配符 切记文件通配符两侧引号,避免shell手快进行文件名展开。匹配规则是要传进find程序的,因为不单单要在本目录下找,可能还要递归的找。
-regex 正则表达式 带路径的
-type f普通文件 d目录 l符号链接文件 c字符设备文件 b块设备文件 p管道文件
-size +n单位 -size -n单位 单位有c字符b块kMG默认是b,b是512字节
-mtime +n -n
-newer filename
动作
-print 打印路径+文件名
-exec xxxxxx {} \; 执行某一命令
-ok 与-exec的区别是对每一个符合条件的{}执行操作前都进行询问

解释命令:find . -type d -print

从当前目录开始查找,找到所有目录并打印出路径

解释命令:find / -name “stud*” -type d -print

从当根目录开始查找,满足名字是stud开头的目录并打印出路径(两个条件是“与”的关系,且-name后的星号是文件通配符不是正则的元字符)

解释命令:find / -type -f -mtime -10 -print

从根目录开始查找,满足名字是stud开头的目录并打印出路径(两个条件是“与”的关系,且-name后的星号是文件通配符不是正则的元字符)

解释命令:find . ! -type d -link +2 -print

从当前目录查找,类型不是目录,且link数大于2的文件,打印路径

解释命令:find . -size +100k \( -name core -o -name ‘*.tmp’ \) -print

此句*.tmp 的两侧使用单双引号均可
*前可用\转义,()前也可用\转义
从当前目录开始查找,满足条件1.大小大于100k 2.名字是core或以.tmp结尾的文件,打印路径

find /lib /usr -name ‘libc*.so’ -exec ls lh {} \;

find src -name \*.c -exec frep -n — –help {} /dev/null \;

find . -type d -exec sh -c '[ -f "1"/README ] || touch "1"/README' _ {} \;

递归地在所有子目录下添加 README 文件(如果该目录下还没有 README)

find . -type d -exec sh -c '[ -f "1"/README ] || echo "# Directory:1" > "$1"/README' _ {} \;

添加内容到 README,比如写一句话或模板

find . -type f -name ‘README.md’ -delete

递归地删除所有子目录下的 README.md(无论是否存在内容)

find . -name CVS –exec rm –rf {} \; 和 find . -name CVS -print | xargs rm –rf哪个会成功、哪个会失败?

xargs可以将标准输入构造为命令的命令行参数,如果太多,可自动分批。且可以使用xargs的-n选项手动指定每批处理多少个。

rm -f .dat 文件名.dat展开失败可能的原因是什么?有什么代替命令

ls | grep “.dat$” | xargs rm -f

ls的选项:-F(早期终端没颜色时如何区分列出的是——目录/?可执行文件*?符号链接文件@?普通文件-l(等价于ll)-h(把大小转换成人可读的单位,字节数-> K或M什么的)

  • ls 和 ls * 的区别

ls 列出当前目录下的所有文件和目录。
* 代表当前目录下的所有文件和目录,ls * 列出当前目录下的所有文件(不包括目录)以及当前目录下所有目录中的内容。

  • ls -l 和 ll 的区别

如果设置了set -x,或者输入命令alias查看系统已经设置的全部别名,就会发现,ll是ls -l的别名,没有区别
# ll
+ ls –color=auto -l –color=auto

  • ls -ld 目录名 的输出是什么

该目录本身的信息,如果没有d,输出的就是目录内部的文件

当前工作目录是进程的一部分,命令:pwd打印当前目录,cd改变当前目录

  • cd后面什么都不加会发生什么?

回到用户主目录

  • 内部命令 vs 外部命令

内外是相对shell来说的,shell接收到操作员输入的一行字符串后,进行一系列加工(通配符展开)过后,最左边的单词看作命令的名字。如果这个命令是shell自己决定的,那么就是内部命令。如果需要去磁盘找可执行文件,是外部命令。
例如,cd是shell的内部命令,ls是外部命令。

mkdir, -p自动创建,rmdir

rmdir 与 rm -r 的区别

rmdir只能删除空目录(里面只能有. 和 ..),所以不怎么用。
rm -r是常用的,-r是递归的意思,把子子孙孙都删除

cp -r dir1 dir2 如果dir2存在/不存在,分别发生什么

存在:dir2新建子目录dir1,把dir1里的内容复制到dir2/dir1中
不存在:新建dir2,把dir1里的内容复制到dir2中

cp -v 冗长,了解进度
cp -u 根据时间戳增量拷贝,用于备份更新。好处:快;如果dir1和dir2写反了不会灾难
touch 修改时间戳

命令如何获取信息?硬编码是不可取的。

  • 配置文件
    • 分为:系统级偏好配置,例如bash的/etc/profile
    • 用户级偏好配置,~/.bash_profile)
  • 环境变量
    • 获取的方式:getenv
  • 命令行参数
    • 三种风格
    • (dd风格)dd if=sysdisk.img of=/dev/sdb
    • (find,gcc风格) gcc -O0 -Wall -g -masm=intel -Wa,-ahl -c shudu.c
    • (ls风格,长选项和短选项)–width=80 或 -w80
  • 交互式键盘输入
    • 这种方式在Linux命令中极少使用

STICKY权限(粘着位)能解决什么问题?

目录有写权限并且带STICKY属性,此目录下的文件仅文件主可以删除,其他用户删除操作会失败

第四章 bash脚本

脚本文件的执行有几种写法?有什么区别?

  • 三种新建子shell的执行方式:
    • bash<脚本名 (不可携带参数,其他都可携带参数)
    • bash 脚本名
    • ./脚本名(需先给脚本添加x权限,chmod u+x 脚本名)
  • 两种在当前进程中执行:
    • . 脚本名
    • source 脚本名

输入重定向符号<、<<和<<<的区别是什么

一个<:用法为 “命令 < filename”,把filename这个文件当作stdin
两个:用法为 “命令 << 定界符”,接下来可连续输入多行,直到再次遇到定界符,把这几行作为输入给到命令。其中可以使用反撇号做变量替换
三个:用法为“命令 <<< 内容”,只会取得第一个单词作为输入内容给到命令

输出重定向> >> 2>的区别是什么?

> filename 先清空(覆盖)
>> filename 追加
2> 把输出到2号文件(stderr)的内容重定向
分离stdout和stderr的意义是,程序运行时的输出可以重定向到文件,而运行过程中出现的错误可打印到屏幕上,给操作员看。如果非要把两个放一起,可以使用2<&1

我想用gcc a.c -o a > try.err 来把编译时输出的错误重定向到try.err,为什么没效果?

要使用gcc a.c -o a 2> try.err,或者 gcc a.c -o a > try.err 2>&1
但不能写为gcc a.c -o a 2>&1 > try.err

如果想使用 | more 把gcc输出的错误分屏显示,怎么办?

要使用gcc a.c -o a 2>&1 | more

在c语言程序中输出到文件时一定要先打开文件再输出吗?能不能直接指定一个数当作文件描述符?

可以。分为两种情况:
一是0,1,2是固定的,可直接使用
二是如果在运行c程序时在命令行使用“./可执行文件 5< a.txt”那么在c程序内无需打开5号文件,运行完毕后直接打开a.txt查看结果即可。注意5的后面没有空格。

引用bash变量addr的方式有{addr}和addr,区别是什么

当想拼接时,只能用${addr}AAA

当在shell中引用未定义变量时默认为空串,这很坏了,怎么使之产生一个错误?

set -u。如果取消设置即为set +u

一般情况下当前环境变量 PATH 不包括当前目录,原因何在?

在命令的组合使用中,用{}和()的区别是什么?

1.()启动子shell,{}在当前shell执行。最显著的现象就是如果有cd,那么()后当前目录不变,而{}后当前目录改变
2.()是元字符,而{}不是,是命令。所以(后可不加空格,而{后必须加空格。
3.分号的区别(1;2){1;2;} 多行可不写分号,捏成一行时要注意{后的空格和}之前的分号

第五章 进程

编写 C 语言程序,使用与下列 shell 命令相同的机制完成同样的功能
sort < aaa.txt > bbb.txt

思路:0 dup到 aaa.txt,1 dup到 bbb.txt

int main(){
    int sv;
    if (fork() == 0) {
        int fd1 = open("aaa.txt", O_RDONLY);
        dup2(fd1, 0);
        close(fd1);
        int fd2 = open("bbb.txt", O_CREAT | O_WRONLY, 0666);
        dup2(fd2, 1);
        close(fd2);
        execvp("sort");
        exit(-1);
    }
    wait(&sv);
}

编写 C 语言程序,使用与下列 shell 命令相同的机制完成同样的功能
cat aaa.txt | grep — –help

思路
进程A:执行cat aaa.txt,标准输入 -> 不变;标准输出->管道入口
进程B:执行grep — –help,标准输入 -> 管道出口;标准输出-> 不变
父进程:什么都不做

int main()
{
        int fd, sv;
        pipe(fd);
        if (fork() == 0) {
            dup2(fd[1], 1);
            close(fd[1]);
            close(fd[0]);
            execlp("cat", "a.txt", 0);
            exit(1);
        } else if (fork() == 0) {
            dup2(fd[0], 0);
            close(fd[0]);
            close(fd[1]);
            execlp("grep", "--", "--help", 0);
            exit(1);
        }
        close(fd[0]);
        close(fd[1]);
        wait(&sv);
        wait(&sv);

(样题)
编写 C 语言程序,使用与下列 shell 命令相同的机制完成同样的功能
ps -ef > proc.list; grep root < proc.list

思路
进程A:执行ps -ef,标准输入 -> 不变;标准输出->proc.list
父进程:等待进程A执行完毕后,执行grep root,标准输入 -> proc.list;标准输出 -> 不变

int main()
{
    int sv;
    if (fork() == 0) {
        int fd1 = open("proc.list", O_CREAT | O_WTONLY, 0666);
        dup2(fd1, 1);
        close(fd1);
        execlp("ps", "-ef", 0);
        exit(1);
    }
    wait(&sv);
    int fd2 = open("proc.list", O_RDONLY);
    dup2(fd2, 0);
    close(fd2);
    execlp("grep", "root", 0);
}

(上机作业四)
编写 C 语言程序,使用与下列 shell 命令相同的机制完成同样的功能
grep -v usr < /etc/passwd | wc –l > r.txt; cat r.txt

思路
进程A:执行grep -v usr,标准输入 -> /etc/passwd;标准输出->管道入口
进程B:执行wc –l,标准输入 -> 管道出口;标准输出-> r.txt
父进程:等待两个进程都执行完毕后,执行cat r.txt