Linux--项目--Linux系统下的mybash项目
项目名称:Linux 系统下的 mybash 项目
项目简介:模拟实现 Linux 系统 shell 的命令解析功能及简单命令的实现。
项目环境:Red Hat Enterprise Linux 6
具体实现:采用了多进程编程,父进程负责接收并解析命令和识别所带参数,父进程在解析出命令后,使用fork创建子进程,exec函数进行子进程替换,由子进程执行命令。并用信号来防止子进程变为僵死进程,将实现了的ls, mkdir , touch ,cd,rm等命令程序存放在mybin 文件中。
项目职责:我是一名开发人员,主要负责项目流程设计以及实现简单命令ls,pwd。
bash分为两种命令:内置命令和普通命令
具体实现步骤:
1.打印提示符:例如:[stu@localhost tmp]$ 用函数获取用户名,
2.从键盘输入命令:如:ls,pwd,ps -f,cp a.c b.c
用fgets()获取键盘输入,记得将最后的回车符置为'\0',因为计算大小会将回车符算进去。
3.对输入的命令进行解析,将获取到的命令用stdtok()以空格符分割字符串,将每个字段存入数组中。
4.如果是内置命令,直接调用系统函数完成,比如cd,exit。
因为内置命令是对本进程进行操作的,所以必须在父进程中执行。exit直接break就可实现,cd用chdir()实现。
为什么不能用子进程:如果非要在子进程中做,子进程不会改变父进程的状态。
5.如果是普通命令,先fork()一个子进程,再用exec()替换成要执行的命令。
要想用自己的命令实现,就要在替换的时候用当前路径拼接在命令前,否则执行的是系统的命令。
如果给了绝对路径,就不需要拼接。
比如实现pwd命令,也很简单,调用getcwd():
实现ls,用opendir+readdir扫描文件目录然后输出,最后closedir,代码如下:
如果要将隐藏文件不输出,可以用strncmp(p->name,'.',1) == 0),如果是.开头就continue,不输出。
如果需要颜色输出,需要获取文件属性,用结构体stat获取文件属性,如果文件是普通文件,判断执行权限,如果是目录文件,颜色设为蓝色,具体设置颜色用下面的方法直接输出,如果算大小时,其中'\033'被看做一个整体。
6.父进程wait等待子进程结束。