题目: 编写一个C语言程序作为Linux内核的Shell命令行解释程序,实现以下功能: (1)解析用户提交的命令行;按照环境变量搜索目录系统;执行命令。 (2)提供ls、mkdir rmdir、pwd、ps等内部命令。 (3)提供历史查询功能。如用户按下Ctr1+C,信号处理器将输出最近的10个命令列表。
直接贴实验代码,各位读者慢慢研读,最好不求甚解,否则会陷入好多我们不了解的知识问题里,比如代码里的获取ctrl+c的信号函数
先在ubantu下用mkdir命令创建一个目录文件(保持良好文件整理习惯)
这里创建了名为subshell的目录文件
setup.h
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include "queue.h"
#define MAX_LINE 80
void setup(char *inputBuffer, char *args[], int *background);
setup.c
#include "setup.h"
void setup(char *inputBuffer, char *args[], int *background){
int length;//命令的字符数目
int i;//循环变量
int start;//命令的第一个字符位置
int ct;//下一个参数存入args[]的位置
ct = 0;
/**
*读入命令行字符,存入inputBuffer
*/
length = read(STDIN_FILENO, inputBuffer, MAX_LINE);
start = -1;
if(length == 0) exit(0);
if(length < 0){
//ctrl+c will read error, and return null
args[0] = NULL;
return;//输入ctrl+c时,会进入错误读取。从而退出setup函数,避免异常
}
/*用户通过输入"rx" 可以运行之前10 个命令中的任何一个,其中"x" 为该命令的第一个字母。如果有个命令以"x" 开头,则执行最近的一个。同样,用户可以通过仅输入"r"来再次运行最近的命令*/
if(inputBuffer[0]=='r'){
char *str;
if(inputBuffer[2]=='\n'||inputBuffer[2]=='\t'){
if((str=g