实现一个简单的minishell

it2024-01-29  62

shell是什么?

shell是一个程序----打开一个终端运行的程序----命令解释行程序,运行在终端之上,捕捉用户的输入;然后决定要运行哪个shell命令程序

流程

捕捉键盘输入 scanf/gets

获取到键盘输入的数据 — [ ls -l -a ]

字符串格式解析 — 以空白字符作为间隔,分割成为一个个的字串, 去掉空白字符 char tmp[1024] = " ls -l -a"; char *ptr = tmp; char *argv[32] = {NULL}; int argc = 0; while(*ptr != ‘\0’){ if(*ptr != ’ '){ argv[argc] = pptr; argc++; while(*ptr != ’ ’ && *ptr != ‘\0’){ ptr++; } *ptr = ‘\0’; } ptr++; }

运行ls程序 — 让我们的shell程序创建一个子进程, 在子进程中进行程序替换, 替换为ls

创建子进程

程序替换

进程等待, 等待子进程退出

代码如下:

int main(int argc, char *argv[]) { while(1){ printf("[shen]@localhost$ "); fflush(stdout); char tmp[1024] = {0}; gets(tmp); //解析字符串 char *argv[32] = {NULL}; int argc = 0;//2.程序替换 char *ptr = tmp; while(*ptr != '\0'){ if(!isspace(*ptr)){ argv[argc]= ptr; argc++; while(!isspace(*ptr) && *ptr != '\0')ptr++; *ptr = '\0'; } ptr++; } argv[argc]= NULL; //运行argv[0]这个程序 //1.创建子进程 pid_t pid = fork(); if(pid < 0){ perror("fork error"); return -1; } else if(pid == 0){ //2.程序替换 execvp(argv[0], argv); exit(0);//替换失败则直接退出 } wait(NULL);//等待子进程退出 } return 0; }

此程序用了int isspace(int c); 从手册查到: checks for white-space characters. In the “C” and “POSIX” locales, these are: space, form-feed (’\f’), newline (’\n’), carriage return (’\r’), horizontal tab (’\t’), and vertical tab (’\v’). 头文件为:#include <ctype.h>

最新回复(0)