没有合适的资源?快使用搜索试试~ 我知道了~
操作系统实验报告 shell程序
3星 · 超过75%的资源 需积分: 11 40 下载量 118 浏览量
2011-05-27
00:02:37
上传
评论 2
收藏 112KB DOC 举报
温馨提示
试读
15页
操作系统实验报告 本实验要实现一个简单的命令解释器,也就是Linux中的shell程序。 能够执行fg、bg、cd、history、exit等内部命令。
资源推荐
资源详情
资源评论
操作系统实习报告 日期:
实习题目: shell 程序
完
成
人
姓名: 组号: 学号
实习
内容
简要
描述
本实验要实现一个简单的命令解释器,也就是 Linux 中的 shell 程序。
实验程序起名为 ysh,要求其设计类似于目前流行的 shell 解释程序,如 bash、csh、tcsh,但不需要具备那
么复杂的功能。ysh 程序应当具有如下一些重要的特征:
能够执行外部程序命令,命令可以带参数。
能够执行 fg、bg、cd、history、exit 等内部命令。
使用管道和输入输出重定向。
支持前后台作业,提供作业控制功能,包括打印作业的清单,改变
当前运行作业的前台/后台状态,以及控制作业的挂起、中止和继续
运行。除此之外,在这个实验中还须做到:
使用 make 工具建立工程。
使用调试器 gdb 来调试程序。
提供清晰、详细的设计文档和解决方案。
主 要
代 码
结构
( 附
注
释)
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <math.h>
#include <signal.h>
#include <stdlib.h>
#include "ysh.h"
#define NO_PIPE -1
#define FD_READ 0
#define FD_WRITE 1
int is_founded(char * cmd)
{
int k = 0;
while(envpath[k] != NULL){ strcpy(buf,envpath[k]);
strcat(buf,cmd);
if(access(buf,F_OK) == 0){ return 1;
} k++;
}
return 0;
}
void getenviron(int n,char * s)
{ int i = 0,j = 0,k = 0;
char c;
char buff[80];
char * p;
while((c=s[i]) != '=') { buff[i++] = c;
} buff[i++] = '\0';
if(strcmp(buff,"PATH") == 0) {
while(s[i] != '\0'){ if(s[i] == ':') {
buff[j++] = '/';
buff[j] = '\0';
p = (char *)malloc(strlen(buff) + 1);
strcpy(p,buff);
envpath[k++] = p;
envpath[k] = NULL;
j = 0;
i++;
} else {
buff[j] = s[i];
j++;
i++;
}
}
} else
fprintf(stderr,"No match");
}
int getline(int fd,char * buf)
{ int i = 0;
char c;
while(read(fd,& c,1)) {
buf[i++] = c;
if(c == '\n') {
buf[i-1] = '\0';
return i;
}
} return i;
}
void init_environ()
{
int fd,n;
char buf[80];
if((fd = open("ysh_profile",O_RDONLY,660)) == -1) {
printf("init environ variable error!\n");
exit(1);
}
while((n = getline(fd,buf)) != 0) {
getenviron(n,buf);
}
envhis.start = 0;
envhis.end = 0;
head = end = NULL;
}
int pipel(char * input,int len)
{ char * argv[10][30];
char * filename[0];
int i,j,k,is_bg = 0;
int li_cmd = 0;
int fd[10][1],pipe_in = -1;
int pipe_out = -1,flag = 0;
pid_t pid;
for(i = 0,j = 0,k = 0;i <= len;i++) {
if((input[i] == ' ') || (input[i] == '\t') || (input[i] == '\0') ||
(input[i] == '|') || (input[i] == '>') || (input[i] == '\n')){
if((input[i] == '|') || (input[i] == '>')){
if(input[i] == '>') {
flag =1;
}
if(j > 0 ) {
buf[j++] = '\0';
argv[li_cmd][k] = (char *)malloc(sizeof(char) * j);
strcpy(argv[li_cmd][k],buf);
k++;
}
argv[li_cmd][k] = (char *)0;
li_cmd++;
k = 0;
j = 0;
}
if(j == 0) {
continue;
} else {
buf[j++] = '\0';
if(flag == 0) {
argv[li_cmd][k] = (char *)malloc(sizeof(char) * j);
strcpy(argv[li_cmd][k],buf);
k++;
剩余14页未读,继续阅读
资源评论
- u0146297672014-04-11谢谢!不过报告格式很简单啊,只有代码
ly0811
- 粉丝: 0
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功