文章目录
  1. 1. 学习资料
  2. 2. shell
    1. 2.1. 可执行的程序命令
    2. 2.2. 重定向命令
    3. 2.3. 管道命令
    4. 2.4. 源代码

学习资料

这学期准备学习下mit xv6课程以更好的理解操作系统,下面先列举下学习资料:

  1. xv6主页
  2. xv6-rev8.pdf
  3. book-rev8.pdf
  4. guleilab.com
  5. csdn cinmyheart
  6. cnblogs fatsheep9146

shell

homework的作业是在源代码的基础上进行修改,以实现了基础的三类命令

  • 可执行的程序命令
  • 重定向命令
  • 管道命令

下面给出代码片段:

可执行的程序命令

1
2
3
4
if(execv(ecmd->argv[0] , ecmd->argv) == -1){
fprintf(stderr, "execv %s fails\n", ecmd->argv[0]);
exit(0);
}

重定向命令

在这里自己先写了一个版本,如下:

这里写图片描述

后来发现源代码中已经写好了一些函数,直接调用即可!

这里写图片描述

管道命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if(fork1() == 0){
close(1);
dup(p[1]);
close(p[0]);
close(p[1]);
runcmd(pcmd->left);
}

if(fork1() == 0){
close(0);
dup(p[0]);
close(p[0]);
close(p[1]);
runcmd(pcmd->right);
}
close(p[0]);
close(p[1]);
wait();
wait();

分析:
第一次调用fork1(),产生 child process 1, 该进程用于运行 pcmd->left 指向的进程

第二次调用fork1(),产生 child process 2 ,该进程用于运行 pcmd->right 指向的进程

child process 1 由于先 close(1)那么文件描述符1就被空余出来了, 调用dup(p[1])把 child process 1的标准输出(文件描述符默认的是1)和管道的输出关联起来。

child process 2的伎俩差不多,只是把进程的标准输入关闭了,把从管道的输入作为进程的标准输入来用.

这里必须两个wait(),因为这里有两个子进程,parent process必须等这两个进程都挂了之后再结束.

源代码

完整代码


参考资料:

  1. csdn cinmyheart
  2. 6.828
文章目录
  1. 1. 学习资料
  2. 2. shell
    1. 2.1. 可执行的程序命令
    2. 2.2. 重定向命令
    3. 2.3. 管道命令
    4. 2.4. 源代码