主要实现的是三个部分的功能,命令执行,重定向,管道。
1)命令执行:
case ' ':
ecmd = (struct execcmd*)cmd;
if(ecmd->argv[0] == 0)
_exit(0);
if (access(ecmd->argv[0], F_OK) == 0)
execv(ecmd->argv[0], ecmd->argv);
else {
strcat(PATH, ecmd->argv[0]); //make the absolute path of this command. for example, you type in "ls", then its absolute path is "/bin/ls"
if(access(PATH, F_OK) == 0) //If this command can be found, then execute
{
execv(PATH, ecmd->argv);
}
else {
fprintf(stderr, "%s: Command not found.\n", ecmd->argv[0]);
}
}
//fprintf(stderr, "exec not implemented\n")
// Your code here ...
break;
2)重定向
case '>':
case '<':
rcmd = (struct redircmd*)cmd;
close(rcmd->fd); //close stdin or stdout
if(open(rcmd->file, rcmd->flags , 0777) < 0) { //open file with fd 0(stdin) or 1(stdout)
fprintf(stderr, "open %s failed!\n", rcmd->file);
exit(0);
}
runcmd(rcmd->cmd);
break;
3)管道
case '|':
pcmd = (struct pipecmd*)cmd;
if(pipe(p) < 0){
fprintf(stderr, "create pipe failed!\n");
exit(0);
}
int t1=fork1();
if(t1 == 0){ //left cmd close stdout to redirect to pipe's input
close(1);
dup(p[1]);
close(p[0]);
close(p[1]);
runcmd(pcmd->left);
}
else {
wait(&r);
int t2 = fork1();
if (t2 == 0) { //right cmd close stdin to redirect to pipie's output
close(0);
dup(p[0]);
close(p[0]);
close(p[1]);
runcmd(pcmd->right);
}
else{
close(p[0]);
close(p[1]);
wait(&r);
}
}
break;
相关的点下面这两篇文章都写得非常详细了,在这里不在赘述。