资源简介
操作系统课的作业。实现了顺序执行命令,管道和重定向的嵌套,还有简单的history功能
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
static struct termios term;//设置getchar的全局变量
struct history//历史槽的结构体
{
char *his[30];
int len[30];
int count;
};
int do_command(char *argv[]int argc);
int deal_com(char *argv[]char *command);
int do_cd(char *dir);
void do_pipe( char *argv[]int argc );
void do_outfile( char *argv[]int argc );
void do_infile( char *argv[]int argc );
int do_command(char *argv[]int argc);
void setch();
void full(struct history *his);
void printcommand(char command[])//打印当前命令
{
int i=0;
char ch;
ch = command[i++];
while(ch!=‘\0‘)
{
printf(“%c“ch);
ch = command[i++];
}
}
int deal_com(char *argv[]char *command)//处理命令和参数,结果保存在argv[]中
{
int count=0i=0j=0;
while( count<30 )
{
argv[count] = (char *)malloc(100*sizeof(char));
++count;
}
count = 0;
while( command[count] == ‘ ‘ )//先忽略所有空格一次
count++;
while( command[count] != ‘\0‘ )
{
if( command[count] == ‘ ‘ )//以空格做分割符
{
while( command[count] == ‘ ‘ )
count++;
argv[i][++j] = ‘\0‘;
++i;
j=0;
}
else
{
argv[i][j++] = command[count];
count++;
}
}
argv[i][++j]=‘/0‘;
argv[++i] = NULL;
return i;
}
int do_cd(char *dir)//cd命令
{
if(dir == NULL)
printf(“Change dir error.\n“);
else
{
if(chdir(dir)<0)
printf(“Change dir error.\n“);
else
printf(“Change dir successed.\n“);
}
}
void do_pipe( char *argv[]int argc )
{
int fd[2];
pipe(&fd[0]);
char *argv1[30]*argv2[30];
int i=0j=0argc1argc2;
while( i<30 )
{
argv1[i] = (char*)malloc(100*sizeof(char));
argv2[i] = (char*)malloc(100*sizeof(char));
++i;
}
i=0;
while( strcmp(argv[i]“|“)!=0 )
{
argv1[i] = argv[i];
++i;
}
argv1[i++] = NULL;
argc1 = i-1;
while( i {
argv2[j++] = argv[i++];
}
argv2[j] = NULL;
argc2 = j;
if(fork()!=0)
{
close(fd[0]);
close(1);
dup(fd[1]);
close(fd[1]);
do_command(argv1argc1);
exit(0);
}
else
{
close(fd[1]);
close(0);
dup(fd[0]);
close(fd[0]);
do_command(argv2argc2);
exit(0);
}
}
void do_outfile( char *argv[]int argc )//输入重定向
{
int i=0fid;
while( strcmp(argv[i]“>“) )
{
++i;
}
fid = open(argv[i+1]O_WRONLY|O_CREAT);
close(1);
dup(fid);
close(fid);
argc = i;
argv[i] = NULL;
do_command(argvargc);//完成命令
}
void do_infile( char *argv[]int argc )//输出重定向
{
int i=0fid;
while( strcmp(argv[i]“<“) )
{
++i;
}
fid = open(argv[i+1]O_RDONLY);
close(0);
dup(fid);
close(fid);
argc = i;
argv[i] = NULL;
do_command(argvargc);//完成命令
}
int do_command(char *argv[]int argc)//执行命令,包括管道和重定向
{
pid_t pid;
int i=0flag=0;
while( argv[i] != NULL )//检测是否有管道或重定向或后台
{
if( strcmp(argv[i]“|“)==0 )
{
flag = 1;
}
else if( strcmp(argv[i]“>“)==0 )
{
flag = 2;
}
else if( strcmp(argv[i]“<“)==0 )
{
flag = 3;
}
else if( strcmp(argv[i]“&“)==0 )
{
flag = 4;
}
++i;
}
switch(fl
- 上一篇:SAP表结构关于SAP各table之间的关系
- 下一篇:遗传算法求解VRP
相关资源
- uboot到linux logo显示不间断 补丁
- UNIX/LINUX编程实践教程的源码
- Linux任务管理器
- linux应用层的华容道游戏源代码
- ubuntu9.10 可加载内核模块和字符设备驱
- MP3文件ID3v2ID3v2APEv2标签读取
- 操作系统实验——虚存管理实验
- linux下的发包工具sendip
- 尚观培训linux许巍关于c 的笔记和讲义
- 尚观培训linux董亮老师关于数据结构的
- linux 线程池源码 c 版
- linux C 电梯程序练习
- linux下用多进程同步方法解决生产者
- Linux 操作系统实验(全)
- Linux From Scratch 中文手册
- linux 网络实验 ftp程序
- Linux命令大全离线版&在线版
- 操作系统共享内存实验
- dos 下运行Linux 命令--gnu_utils
- linux 0.12内核源代码
- linux简易shell C实现
- linux实验报告及心得体会
- 基于GTK的Linux环境下的简易任务管理器
- linux扫雷游戏代码
- CAN Linux驱动代码
- Linux系统教材
- intel 82579LM 网卡驱动Linux系统版 v1.9.
- SA1110处理器掌上电脑液晶显示器设计
- 基于Linux的串口服务器设计
- shell从入门到精通
评论
共有 条评论