UNIX管道应用及Shell实现(一)-主体框架

本文介绍了在UNIX操作系统中实现简单Shell的过程,包括重定向、管道、后台运行等功能。文章详细阐述了基本思路,如命令解析、管道的实现、父子进程通信以及历史命令功能的实现。难点在于管道的实现和进程间信号的处理,文中给出了相应的解决方案。


操作系统的第一个大作业是做一个简单的Shell,实现重定向、管道等功能。奋战了好几天终于基本搞定了= =

基本要求

Shell能够解析的命令行法如下:

  1. 带参数的程序运行功能。

    program arg1 arg2 … argN

  2. 重定向功能,将文件作为程序的输入/输出。
    a)“>”表示覆盖写

    program arg1 arg2 … argN > output-file

    b)“>>”表示追加写

    program arg1 arg2 … argN >> output-file

    c)“<”表示文件输入

    program arg1 arg2 … argN < input-file

  3. 管道符号“|”,在程序间传递数据(最后也可用重定向符号)

    programA arg1 … argN | programB arg1 … argN | programC …

  4. 后台符号& ,表示此命令将以后台运行的方式执行

    program arg1 arg2 … argN &

  5. 工作路径移动命令cd

  6. Shell退出命令exit

  7. history显示开始任务后执行的命令;history n显示最近执行的n条指令

基本思路

很明显本次实验主要是以考察Shell基本功能以及管道的实现为主。之前已经详细讲解了管道的实现,可以参考这篇文章

熟悉命令

首先我们先在UNIX自带的Shell下实现重定向和管道功能,示例命令可以参考如下:

# ps &
# cat numbers.txt | sort > temp.txt
# sort < numbers.txt | grep 1 > a.txt
# ps -ef | grep -sh
# cd ..

我们不难发现:
1. “>”,“>>”重定向命令只能在命令中出现一次,一旦出现后,之后还有什么命令也是无效的。
2. “<”命令也只能出现一次,但是后面可以接管道命令。
2. “|”管道命令可以出现多次,且管道之后还可以使用重定向符号。
3. 实际上所有命令进入程序之后都是一串字符串,因此对字符串的解析是最重要的。
4. 对于pslscd等命令,可以使用exceve命令进行操作,并不需要我们自己实现。
5. 如果注意,可以发现系统Shell在实现后台进程时,可能会出现如下情况:
p1

我们让ls的结果在后台运行,但为什么会在结果前多一个“#”呢?
原因是因为后台运行的子进程和前台运行的父进程同时进行,谁先谁后不能确定,图中就是父进程先运行,打印了“#”,子进程再打印ls的结果,因此出现了这种情况。

难点

  1. 管道的实现以及fork()的使用。
  2. 子父进程进行信号交互,以及回收僵尸进程。
  3. 多文件的协调和编译。

大体框架

主函数入口

由于我们在Windows下写这个Shell无法编译,每次必须在UNIX下编译,因此必须在写之前就想好模块布局,不然很难debug和进行单元测试。
一个Shell其实就是一个while(1)的死

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值