91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 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

評論

共有 條評論