资源简介
操作系统课的作业。实现了顺序执行命令,管道和重定向的嵌套,还有简单的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
相关资源
- 三级Linux应用与开发技术考试大纲20
- vimrc的配置文件
- 注册表中的shell注册文件
- 4412开发板linux-QT下使用wfi设置
- linux下的ddos工具
- iMX6 EIM总线驱动程序
- 东北大学linux操作系统期末作业
- Linux运维视频零基础入门到精通.txt
- linux文件读写锁C代码
- Dedegetshell
- Obfuscation.shollvm移植到LLVM10.0.1以及更高
- 路由器实现源码
- 嵌入式Linux应用开发完全手册-完整版
- 红帽首届大学生LINUX技能大赛报名.x
- 嵌入式Linux用户态操作GPIO接口代码和
- bacnet-stack-0.8.0
- zookeeper3.5.1
- sac-101.6a-linux_x86_64.tar.gz
- linux下的金山词霸辞典
- 在Linux下(VRRP)虚拟路由冗余协议介
- Linux CAN编程详解配套代码
- 基于S3C2440和嵌入式Linux的扩展串口设
- 基于nios和μClinux的嵌入式系统设计
- DOSCommand Shell
- Linux下对NS2项目的仿真分析全过程从
- 跨平台的网络数据嗅探抓包程序基于
- LinuxSystemProgramming+Linux系统编程中英文
- 鸟哥的Linux私房菜-服务器架设篇(第
- 基于ARM平台Linux+Xenomai系统搭建及主站
- PCIE驱动开发
评论
共有 条评论