xv6 shell编程
学习资料
这学期准备学习下mit xv6课程以更好的理解操作系统,下面先列举下学习资料:
shell
homework的作业是在源代码的基础上进行修改,以实现了基础的三类命令
- 可执行的程序命令
- 重定向命令
- 管道命令
下面给出代码片段:
可执行的程序命令
1 | if(execv(ecmd->argv[0] , ecmd->argv) == -1){ |
重定向命令
在这里自己先写了一个版本,如下:
后来发现源代码中已经写好了一些函数,直接调用即可!
管道命令
1 | if(fork1() == 0){ |
分析:
第一次调用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必须等这两个进程都挂了之后再结束.
源代码
参考资料: