目录

  • 一、内容介绍
    • 1.目的与要求
    • 2.主要内容
    • 3.设计成果要求
  • 二、整体功能及设计
    • 1.程序流程
    • 2.同步功能
    • 3.命令转换
    • 4.cd命令的处理
    • 5.exit命令的处理
  • 三、实验结果
    • 1.实验环境
    • 2.makefile
    • 3.程序界面
    • 4.命令执行
      • 4.1 dir-ls
      • 4.2 rename-mv
      • 4.3 cd-cd(pwd)
      • 4.4 move-mv
      • 4.5 del-rm
      • 4.6 exit-exit
      • 4.7 md-mkdir
      • 4.8 rd-rmdir
      • 4.9 path-echo $PATH
      • 4.10 copy-cp
      • 4.11 time-date
      • 4.12 type-cat
      • 4.13 cls-clear
  • 四、总结与改进
  • 五、源码

一、内容介绍

1.目的与要求

学习UNIX/LINUX系统下的多进程创建、控制和通信。

2.主要内容

(1)Linux上的bash和Windows中的命令行有很大的不同。但是两者都有完成相似任务的命令,比如Linux上bash的ls命令的功能,类似于Windows命令行中的dir命令的功能。用C语言写一个简单的Linux终端软件,接收用户发出的类似于Windows命令行中的命令,转换成对应的Linux命令加以执行,并将执行的结果回显给用户。比如,用户输入“dir”,程序实际返回“ls”的内容。

(2)软件包含前、后台两个程序,用户启动前台程序时,前台程序自行启动后台程序。前台程序提供界面,负责接收用户输入,对输入进行转换,并向后台程序发出实际要执行的指令,后台负责执行实际的指令。

3.设计成果要求

(1)前台程序通过fork和execl系统调用启动后台程序。

(2)前台程序创建消息队列和命名管道,通过消息队列向后台程序发送经过转换的用户命令;通过命名管道从后台程序获取命令执行的结果,并显示在终端。后台程序可以通过popen来执行转换后的命令。

(3)至少实现如下Windows——Linux对照命令:dir——ls,rename——mv,move——mv,del——rm,cd——cd(pwd),exit——exit。

(4)当用户输入exit时,前台程序指示后台程序结束,在后台程序结束后,前台程序退出;在此之前,用户的输入都被作为一条命令进行处理。

二、整体功能及设计

1.程序流程

整个Linux终端软件由两个程序组成:前台程序front.cpp和后台程序back.cpp。

(1)前台程序首先需要创建消息队列和命名管道,然后通过fork和execl系统调用启动后台程序。随后前台程序接受用户的输入,将转换后的命令通过消息队列发送给后台程序。

(2)后台程序开始运行后尝试从消息队列中获取消息,读取成功后利用popen来执行读取到的命令,并写入命名管道。

(3)前台程序在后台程序将命令运行完成后,读取命名管道中的内容,然后继续发送下一条指令。

在整个程序运行过程中,使用一个同步管道来维护前后台程序间的同步:前台程序发送完消息后等待后台程序将执行结果写入后再读取打印,后台程序等待前台程序发送完命令后再读取并执行。

流程图如图1所示:

2.同步功能

在通信过程中,必须保证前后台程序同步,否则可能会得到错误的结果。所谓同步,是指前台程序应该等待后台程序处理完一条指令后再读取结果并打印,然后再发送下一条指令。同时后台程序必须等待前台程序发送完命令后再从消息队列中读取该命令然后执行。

为了保证同步,在消息发送和接收前各加一个同步管道的读写操作。

前台程序的同步代码为:

writeSynPipe();                      //写同步管道
sendMessage(msg, queId);            //发送消息
readResPipe();                       //读结果管道并打印

后台程序的同步代码为:

readSynPipe();                       //读同步管道
if(readMessage(queId, &m) == -1) {continue;                       //继续尝试
}
execCommand(m.text, resCommand);    //执行命令
writeResPipe(resCommand);            //将结果写入管道

其中synPipe是同步管道,resPipe是保存命令执行结果的管道。

3.命令转换

前台程序接收到用户输入的函数后,利用命令转换函数convertCommand()将Windows命令转换为对应的Linux命令。本次实验实现的Windows-Linux命令转换表如下所示。

Windows命令 Linux命令 作用
dir ls 打印当前目录下的文件名
rename mv 重命名文件
cd cd+pwd 切换工作路径
move mv 移动文件
del rm 删除文件
exit exit 退出
md mkdir 创建目录
rd rmdir 删除目录
path echo $PATH 打印可执行文件路径
copy cp 复制文件
time date 显示系统时间
type cat 输出文件到屏幕
cls clear 清屏
其中前六条命令为本次实验要求必须实现的命令,后七条命令为额外实现的命令。

4.cd命令的处理

当前台程序输入cd命令后,通过消息队列发送给后台程序。后台程序通过popen来执行cd命令,由于popen函数的机理是重新fork一个子进程来处理命令,因此后台程序处理完之后并不会改变前台程序的工作路径。

为了解决这一情况,对于每一条用户输入的cd命令,获取路径后在前面加上当前路径(通过getcwd函数获取),形成绝对路径,然后在前台程序中使用chdir函数来切换工作路径。

5.exit命令的处理

当用户输入exit命令时:前台程序将命令发送给后台程序,然后调用waitpid函数等待后台程序退出,此时前台程序被阻塞。后台程序收到exit命令后,立即调用exit(0)退出,退出后前台程序被激活,然后删除管道文件,再调用exit(0)退出。至此,前后台程序都成功退出。

三、实验结果

1.实验环境

操作系统:Ubuntu-20.04
编程语言:C++11
IDE:Visual Studio Code 1.63.2
编译器:g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

2.makefile

创建makefile文件,并输入以下内容:

3.程序界面

打开Linux终端,输入make命令:

然后输入:./front,开始运行前台程序,界面如下所示:

此时后台程序已经启动,等待用户输入。提示语后括号中的内容为当前前台程序所处的工作路径。

4.命令执行

4.1 dir-ls

输入dir命令,实际执行ls命令,结果如下图所示:

可以发现,成功打印了当前文件夹Cyril_KI下的所有文件。

4.2 rename-mv

输入rename t.c f.c,实际执行mv t.c f.c命令;然后输入dir,结果如下所示:

可以看到,目录中原t.c文件已经成功更名为f.c文件。

4.3 cd-cd(pwd)

输入cd A/命令,实际执行cd A/+pwd命令,结果如下所示:

可以看到,当前工作路径已经切换到了A目录下。

4.4 move-mv

输入move命令前,先输入cd …命令,切换到原始目录:

然后输入move f.c A/,实际执行mv f.c A/命令,将f.c移动到文件夹A下;然后cd A/,最后dir,结果如下所示:

可以发现,f.c被移动到了A文件夹下。

4.5 del-rm

输入del a,实际执行rm a命令;然后输入dir,实际执行ls命令,结果如下所示:

可以看到,文件夹A下a文件已经被删除。

4.6 exit-exit

先输入ps,显示当前进程;然后输入exit命令,结果如下所示:

可以看到,输入exit后程序自动退出,并且此时再次输入ps命令后front和back进程已经被清除。

4.7 md-mkdir

重新输入./front启动程序,依次输入md T/和dir命令,结果如下所示:

可以看到,当前文件夹下新增了一个T文件夹。

4.8 rd-rmdir

输入rd T/,然后输入dir,结果如下所示:

可以看到,当前文件夹下的T文件夹已经被删除。

4.9 path-echo $PATH

输入path,实际执行echo $PATH,结果如下所示:

4.10 copy-cp

输入copy G.cpp GG.cpp,实际执行cp G.cpp GG.cpp,然后输入dir,结果如下所示:

可以看到,当前文件夹下多出了一个GG.cpp文件。

4.11 time-date

输入time命令,实际执行date命令,结果如下所示:

可以看到,成功打印出了系统时间。

4.12 type-cat

输入type makefile,实际执行cat makefile,结果如下所示:

可以发现,makefile中的内容被成功打印出来。

4.13 cls-clear

输入cls命令,实际执行clear命令,结果如下所示:

四、总结与改进

本次实验顺利完成了任务书中的各个要求,并且都得到了正确的结果。本次实验的亮点有:

(1)除了任务书要求完成的基本命令转换外,还额外完成了md等七条Windows命令的转换。

(2)研究了popen函数的机理,在执行cd命令时使用chdir函数来对前台和后台程序的工作路径进行切换。

(3)采用命名管道对前后台程序的通信进行同步。

(4)不同输出采用不同颜色,使结果一目了然。

不足之处与改进:

(1)Linux的终端界面比较简洁,可以考虑实现图形界面。

(2)没有考虑太多的异常处理,可以考虑针对用户错误的输入做出相应提示。

五、源码

后面将陆续公开~

Linux课程设计:Linux系统下多进程的创建与通信相关推荐

  1. 嵌入式课程设计linux,嵌入式系统课程设计--基于U盘的linux操作系统的构建

    嵌入式系统课程设计--基于U盘的linux操作系统的构建 1 课程设计报告课程设计报告 课程名称课程名称 嵌入式系统课程设计嵌入式系统课程设计 设计题目设计题目基于基于 U盘的盘的 linux 操作系 ...

  2. linux项目课程设计,LINUX课程设计项目需求解析.doc

    LINUX课程设计项目需求解析 1引言 目前大学生就业形势越来越严峻,为了给学生增加就业砝码,学校为每个学生提供一个展示自我的平台,在学校web服务器上开通注册通道,让每个学生都可以拥有自己的个人网站 ...

  3. linux根文件系统的移植 课程设计,linux课程设计bootloader的移植.doc

    linux课程设计bootloader的移植 嵌 入 式 Linux 课 程 设 计 报 告 课题:嵌入式Linux下的bootloader之u-boot的移植 姓名: 胡欢 专业班级: 电信三班 学 ...

  4. 嵌入式linux设计报告,嵌入式linux课程设计报告

    嵌入式linux课程设计报告 重庆科技学院 课程设计成果 院(系):_电气与信息工程学院_ 班 级: 计科普0802 学生姓名: 庄桐泉 学 号: 2008441067 设计地点(单位)___ _I3 ...

  5. linux的shell编程课设,linux课程设计-shell编程.doc

    linux课程设计-shell编程.doc 还剩 18页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: fido ...

  6. 嵌入式linux设计报告,[嵌入式linux课程设计报告.doc

    [嵌入式linux课程设计报告 重庆科技学院 课程设计成果 院(系):_电气与信息工程学院_ 班 级: 计科普0802 学生姓名: 庄桐泉 学 号: 2008441067 设计地点(单位)___ _I ...

  7. linux系统下对python创建的模块进行打包并发布的具体步骤

    之前在前面的 Python的模块与包 文章中具体的介绍了模块,也介绍了模块创建与发布的步骤. 文章地址:https://blog.csdn.net/Mr_fengzi/article/details/ ...

  8. spooling技术课程设计 linux环境,《SPOOLING技术模拟实现 操作系统原理课程设计》.doc...

    <SPOOLING技术模拟实现 操作系统原理课程设计> ******************* 实践教学 ******************* 兰州理工大学 计算机与通信学院 2010年 ...

  9. java课程设计 考试系统,java课程设计考试系统.

    java课程设计考试系统.Tag内容描述: 1.目 录 第一章第一章 引言引言 3 1 1目的 3 1 2名词解释 3 1 3参考资料 3 1 4文档结构 3 第第 2 章章远景远景 4 2 1项目概 ...

  10. [基于STM32底盘控制与ROS上层导航小车制作] 第五节 实现STM32与ubuntu系统下的ROS串口DMA通信,传输底盘速度等信息

    系列文章目录 第一节 stm32电机驱动与编码器读取反馈 第二节 stm32电机pid控制 第三节 stm32线速度标定 第四节 stm32添加mpu6050得到angle角度 第五节 实现STM32 ...

最新文章

  1. 视频编解码之理论概述 和即时通信
  2. python字符串title函数_python字符串内建函数-capitalize、title、upper
  3. 鸿蒙os内测版应用名称,谁知道报名鸿蒙系统公测,应用名称怎么填的?
  4. Java中的main()方法是强制性的吗?
  5. JSP实例-彩色验证码
  6. SQLSERVER压缩数据文件的用处有多大
  7. HbuilderX + 配置Git 代码托管 - 教程篇
  8. Block循环引用问题(Objective-c)
  9. vb 开机到现在的时间
  10. 撕掉单词书,每天花10分钟做这件事,英语水平暴涨!
  11. mysql replace 只替换第一个_MySQL:replace函数的几种实用场景
  12. Hero引擎47个各种问题解答
  13. Collision Filtering(selective collisions) 碰撞过滤(选择性碰撞)
  14. 深拷贝和浅拷贝的几种方法
  15. Go开发 之 容器(数组Array、切片slice、映射map、列表list)
  16. [源码解析] PyTorch 流水线并行实现 (1)--基础知识
  17. 街篮服务器维护比赛没打完,一球成名!热血街篮追梦杯圆满落幕,WaRn丶警告战队一穿五夺冠...
  18. 继领英后,又一家科技公司宣布离开中国!
  19. centos7安装google浏览器,解决双击无法启动问题
  20. 在服务器上安装媒体播放器

热门文章

  1. 算法导论答案 16.2-2 0-1背包问题的动态规划算法
  2. 微粒群算法(PSO)
  3. 【常用软件下载地址】java开发官方资源下载网址大全(持续更新)
  4. 朋友圈的人脉关系的算法
  5. IIS5 IIS6 IIS7区别
  6. Kano模型思考:以QQ第一版为例,如何确定产品优先级
  7. android10 谷歌服务框架,google服务框架下载官方版
  8. JAVA游戏编程之一----IDE安装调试(3) --JAD 文件介绍--debug调试
  9. HBase Rowkey的散列与预分区设计
  10. 金蝶K3案例教程目录2022