Linux--项目--Linux系统下的mybash项目

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等待子进程结束。

猜你喜欢

转载自blog.csdn.net/qq_41103495/article/details/108748892