【写在前面】:这是操作系统的实验,主要参考了这位大佬的csdn的代码,https://blog.csdn.net/qq_36172505/article/details/80372592。但是可能Ubuntu版本不同,所以他的代码在我这里出现了bug。改了很久的bug,也用gdb调试了许久,bug原因问了老师,老师现在还没答复,有了答复之后再更新。
实验目的
学习如何编写一个Unix Shell程序,使得有机会了解如何创建子进程来执行一项专门的工作以及父进程如何继续进行子进程的工作。熟悉进程概念,了解fork,execve,wait等系统调用。本实验的目的主要在于学会如何在Unix系统下创建进程和管理进程。
实验类型
综合型实验
预习要求
完成第三章进程的学习,了解进程的基本概念及进程的创建与管理。
实验设备与环境
PII以上电脑一台, 已安装Linux操作系统, VC++、GCC或其他C语言编译环境
实验原理
操作系统控制整个硬件与管理系统的活动监测,它不能被用户随意操作,若用户使用不当,可能会造成整个系统崩溃。但我们总是需要让用户操作系统的,这样就有了在操作系统上发展应用程序。用户可以通过应用程序来指挥内核,让内核来完成任务。在整个操作系统中,应用程序在最外层,就如同鸡蛋的外壳一样,这就是shell的由来。
在实现过程中,首先解析用户提交的命令行,通过fork()系统调用产生一进程,调用execvp()函数来完成命令所要求的操作。使用信号(signals)来通知进程事件的发生,并调用信号处理函数来完成处理工作。
实验任务
编写一个C语言程序作为Linux内核的Shell命令行解释程序,实现以下功能:
(1)解析用户提交的命令行;按照环境变量搜索目录系统;执行命令。
(2)提供ls、mkdir rmdir、pwd、ps等内部命令。
(3)提供历史查询功能。如用户按下Ctr1+C,信号处理器将输出最近的10个命令列表。
实验步骤和方法
- setup()函数读取用户的下一条命令(最多80个字符),然后将之分析为独立的标记,这些标记被用来填充命令的参数向量(如果将要在后台运行命令,它将以“&”结尾,setup()将会更新参数background,以使main()函数相应地执行)。当用户按快捷键Ctrl+D后,setup()调用exit(),此程序将被终止。
main()函数打印提示符COMMAND-> ,然后调用setup() ,它等待用户输入命令。用户输入命令的内容被装入一个args 数组。例如,如果用户在COMMAND-> 提示符处输入ls -1 , args[0]等同于字符串ls 和args[1 ]被设置为字符串 –l (这里的字符串指的是以0结束的C字符串变量)。
#include <stdio.h>
#include <unistd.h>
#define MAX LINE 80
void setup(char inputBuffer[], char *args[],int *background)
{
//用于解析命令行的
}
int main(void)