一、引言
Shell命令解释程序中元字符的处理是shell中一个强大的功能,利用对各种字符的不同解释可以充分挖掘出内核的各种强大的潜能。例如利用“&”符号启动并发的后台进程,利用“<”、“>”符号启动I/O重定向,利用“|”启动管道读写等。同样也可以实现其他一些元字符的功能,如“*”通配符,“;”连接符等。
二、实验内容
问题A
实现一个能处理前后台运行命令的shell
问题B
实现一个带有管道功能的shell
问题C
实现一个能处理I/O重定向的shell
问题D
实现一个能在一行上处理多条命令的shell
三、实验代码
/*****************************************
*
* Shell命令解释系统
*
* Copyright: (C) 2018.4.14 by shaomingshan
*
* Compile: gcc -I/usr/include -lreadline -g -o main main.c
*
* Execute: ./main
* ps aux | sort | uniq > aaa
* cat aaa
*
*****************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <readline/readline.h>
#include <sys/stat.h>
#include <wait.h>
#define LS 1024
#define DELIM "<>;|"
int lineeof(char * str) {
/* 判断命令是否完成输入 */
int len = strlen(str);
while (str[len-1] == 32) len--;
if (str[len-1] == 92) {
str[len-1] = '\0';
return 0;
}
return 1;
}
void exec(char * cmd) {
/* 执行命令 */
char *eargv[16];
int i = 0;
eargv[i] = strtok(cmd, " ");
while (eargv[i++] != NULL) {
eargv[i] = strtok(NULL, " ");
}
eargv[i] = 0;
execvp(eargv[0], eargv);
}
char * trim(char *str) {
/* 去前后空白 */
int l = 0;
int r =