博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现一个minishell小程序
阅读量:3943 次
发布时间:2019-05-24

本文共 1373 字,大约阅读时间需要 4 分钟。

minishell的实现

实现逻辑

  1. 从标准输入当中读取数据(要执行的可执行程序)
  2. 拆分可执行程序名称和命令行参数,我们认为从标准输入当中读取到的内容第一个空格之前的数据是可执行程序的名称,第一个空格之后的内容都认为是命令行参数
  3. 创建子进程,子进程程序替换可执行程序
  4. 在子进程程序替换时间内,让父进程进行等待进程等待
  5. isspace()函数,判断一个字符是否有空白字符(空格、换页符、换行符、回车、水平指标符、垂直制表符)
  6. isapace()函数返回值,返回0为没有读到了空白字符,返回非0读到了空白字符

代码实现

#include 
#include
#include
//保存字符的ASCII码值#include
#include
#include
char g_command[1024];//从标准输入当中获取命令int GetCommand(){ //清空字数组 memset(g_command,'\0',sizeof(g_command)); //gets()存在bug,并不会控制读多少数据 //按行读取 printf("[sky@localhost minshell]$ "); //刷新缓冲区 fflush(stdout); //-1是为\0预留位置 if(fgets(g_command,sizeof(g_command)-1,stdin)==NULL) { printf("fgets error\n"); return -1; } return 0;}int ExecCommand(char* argv[]){ if(argv[0]==NULL) { printf("ExecCommand error\n"); return -1; } pid_t pid=fork(); if(pid<0) { printf("create subprocess fail\n"); return -1; } else if(pid==0) { execvp(argv[0],argv); //万一替换失败,一定要杀掉 exit(0); } else { waitpid(pid,NULL,0); } return 0;} int DealCommand(char* command){ //差错控制,排除无效参数 if(!command && *command=='\0') { printf("command error\n"); return -1; } //拆分命令 int argc=0; char* argv[1024]={ 0}; while(*command) { while(!isspace(*command) && *command!='\0') { //argv[0]=ls\0-al argv[argc]=command; argc++; while(!isspace(*command) && *command != '\0') { command++; } *command='\0'; } command++; } argv[argc]=NULL; for(int i=0;i

转载地址:http://afowi.baihongyu.com/

你可能感兴趣的文章
Android 语言码_国家码
查看>>
从iphone和android应用来看公司
查看>>
android 修改代码怎样编译
查看>>
领导者如何增强说服力
查看>>
比金钱更好的十样东西
查看>>
凡事必定不少于三个以上的解决方法
查看>>
带团队的点滴心经
查看>>
五种力量让你如虎添翼
查看>>
你害怕创新吗
查看>>
创新服务的七要素
查看>>
虚伪的奉承也有效
查看>>
蒂姆·库克的五项核心领导力
查看>>
你为何没有成为领导者
查看>>
一切悲剧都源于不当激励
查看>>
别把用户的高期望混同于好体验
查看>>
动机和机会:推动商业发展的引擎
查看>>
4个信号表明你是一个失败的领导
查看>>
成功谈判 你需要几个锦囊?
查看>>
一个人的宽度决定了他的高度
查看>>
善于拜访是另一种经营智慧
查看>>