• 大小: 7KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-05-05
  • 语言: 其他
  • 标签: linux  shell  

资源简介

操作系统课的作业。实现了顺序执行命令,管道和重定向的嵌套,还有简单的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

评论

共有 条评论