大连网站制作公司,搜索引擎入口yandex,网站建设需要匹配人员,给公司申请网站用自己的账号目录
前言
展示效果
实现代码 前言
该代码模拟了shell的实现#xff0c;也就是解析类似于“ls -a -l的命令#xff0c;当我们启动我们自己写的shell的可执行程序时#xff0c;我们输入ls的命令#xff0c;也可以展示出在shell中输入也就是解析类似于“ls -a -l的命令当我们启动我们自己写的shell的可执行程序时我们输入ls的命令也可以展示出在shell中输入ls时同样的效果一下为展示效果
展示效果 当我们在系统的shell下输入ls时会显示 以下代码是我自主模拟实现shell的程序执行ls命令时的情况 是不是很类似呢感兴趣的同学可以看看以下代码自己也模仿模仿哦εεε(~▽)~
实现代码
#include stdio.h
#include string.h
#include unistd.h//sleep函数//wait函数头文件
#include sys/types.h
#include sys/wait.h//exit的函数
#include stdlib.h#define NUM 2024
#define SIZE 100
#define SEP
//注意是而不是.因为strtok的参数是char*类型int main()
{//0.shell或者软件只要启动了使用者不去终止就始终不能停止因此要一个死循环while (1){//1.打印类似于shell命令行前的 [xkjtxlocathost shell] 的信息printf([xkjtxlocatehost myshell]# );//不要换行否则就不像shell了用fflush去刷新缓冲区避免没有\n而导致的不输出[xkjtxlocatehost myshell]# 的问题我在《制作进度条》的那篇博客讲过fflush(stdout);//2.获取命令行char cmd_line[NUM];//可以定义为全局变量注意每次使用前memset(cmd_line, \0, sizeof cmd_line);if (fgets(cmd_line, SIZE, stdin) NULL)//推荐使用fgets建立对标准输入输出流概念方便以后学习基础IO{continue;//读取失败重新读取}cmd_line[strlen(cmd_line) - 1] \0;//char* fgets(char* str, int size, FILE* stream);//如果输入成功则返回str的起始地址否则为NULL//3.拆分命令行char* g_argv[NUM];g_argv[0] strtok(cmd_line, SEP);//第一次调用第一个参数传参目标字符串后面都传NULLint index 1;//使得ls命令时带上颜色if (strcmp(g_argv[0], ls) 0){g_argv[index] --colorauto;}//使得ll命令也可以执行if (strcmp(g_argv[0], ll) 0){g_argv[0] ls;g_argv[index] -l;g_argv[index] --colorauto;}while(g_argv[index] strtok(NULL, SEP));// printf(index %d\n, index);// //检测分割是否正确// for (index 0; g_argv[index]; index)//C99标准不支持在for循环内定义int// printf(g_argv[%d] %s\n, index, g_argv[index]);//4.TODO//内置命令的处理要父进程去执行的命令如cd命令//目前写法发现cd ~, cd -, rm等命令做不了//错误写法// if (g_argv[0] cd)if (strcmp(g_argv[0], cd) 0){if (g_argv[1] ! NULL)//路径合法{chdir(g_argv[1]);continue;//不去创建子进程}}//5.创建子进程//好处不会影响父进程//shell本来就是媒婆招实习生让实习生干活不影响媒婆pid_t id fork();int status 0;if (id 0)//child{execvp(g_argv[0], g_argv);//选这个函数的原因(1)v用的是数组恰好有数组 (2)每个都要绝对路径这是没有必要的因此可以使用带p的函数exit(1);//进行到这里一定是函数调用失败}//这里一定是父进程//father//获取子进程信息pid_t ret waitpid(-1, status, 0);/*#include sys/types.h#include sys/wait.hpid_t wait(int *status);pid_t waitpid(pid_t pid, int *status, int options);*/if (ret 0) //等待子进程成功{printf(exit code %d\n, WEXITSTATUS(status));//打印子进程退出码}}return 0;
}