当前位置: 首页 > wzjs >正文

国内经典网站上海专业优化排名工具

国内经典网站,上海专业优化排名工具,中国建设银行官网网站,电子商务网站建设商城网站1. 打印命令行提示符 在我们使用系统提供的shell时,每次都会打印出一行字符串,这其实就是命令行提示符,那我们自定义的shell当然也需要这一行字符串。 这一行字符串包含用户名,主机名,当前工作路径,所以&a…

1. 打印命令行提示符

在我们使用系统提供的shell时,每次都会打印出一行字符串,这其实就是命令行提示符,那我们自定义的shell当然也需要这一行字符串。

这一行字符串包含用户名,主机名,当前工作路径,所以,我们在打印这行字符串时,需要获取这些信息。根据我们之前学过的知识,我们可以用getenv系统调用来获取!

这里有一个接口gethostname,我试过了用getenv来获取系统的主机名,但是,在我的系统上似乎无法获取,这可能和系统有关,但是我们用gethostname这个接口也可以很安全的获得主机名,具体用法用man手册看一看也就会了。 

 结果没有问题:

2. 获取用户输入

当我们解决了命令行提示符的问题后,接下来我们就会注意到每次执行指令都会有一个光标在闪烁等待用户输入指令!所以我们现在就要解决这个问题!

如果用scanf来获取缓冲区的字符串坑定是不行的,因为scanf默认以空格作为分隔符,而我们在输入指令带选项时,就会有空格!

那我们就用fgets:

 可是为什么回显时有两次换行呢?

原因含很简单:我们在输入指令时,最后输入的换行也在缓冲区中被fges获取保留在数组commandline的最后一个字符,解决方法也很简单,只需要把最后一个字符置为0即可!

现在写的代码还是不够优雅,我们稍微封装一下:

  1 #include <iostream>2 #include <cstdlib>3 #include <cstdio>4 #include <unistd.h>5 #include <cstring>6 7 using namespace std;8 9 #define COMMAND_SIZE 102410 #define FORMAT "%s@%s:%s$ "11 12 const char* get_user_name()13 {14     const char* user=getenv("USER");15     return user==NULL?"NONE":user;16     //return user;17 }18 19 const char* get_pwd()20 {21     const char* pwd=getenv("PWD");22     return pwd==NULL?"NONE":pwd;23 }24 25 //制作命令行提示符Command Prompt26 void make_command_prompt(char cmd_prompt[],int size)27{28     char hostname[256];29     gethostname(hostname,sizeof(hostname));30     snprintf(cmd_prompt,size,FORMAT,get_user_name(),hostname,get_pwd());31 }                                                                                                                                               32 33 //打印命令行提示符34 void print_cmd_prompt()35 {36     char prompt[COMMAND_SIZE];37     make_command_prompt(prompt,sizeof(prompt));38     printf("%s",prompt);39     fflush(stdout);40 }41 42 //获取用户输入的命令43 bool get_command(char* out,int size)44 {45     char* c=fgets(out,size,stdin);46     if(c==NULL) return false;47     out[strlen(out)-1]=0;48     //如果用户什么都没有输入则返回false49     if(strlen(out)==0) return false;50     return true;51 }52 53 int main()54 {55     //1.打印命令行提示法56     print_cmd_prompt();57     //2.获取用户输入的命令58     char commandline[COMMAND_SIZE];59     if(get_command(commandline,sizeof(commandline)))60     {61         printf("%s\n",commandline);62     }63     return 0;64 }

我们使用的shell是不断在获取用户的指令的,也就是说shell一旦跑起来就是一个死循环,直到我们退出shell!所以我们还应该将我们的主体逻辑改一下!

3. 解析命令行

我们获取了用户输入的字符串后【ls -a -l】,我们不可能用这一长串字符串去执行我们的指令,我们需要做的下一步就是将我们获取的字符串按空格切割!具体如何做到如下:

我们先在全局定义一个命令行参数表char*  g_argv[MAXARGC]来记录我们切割的命令行参数

接下来,我们封装一个函数来完成我们的切割任务:

测试函数:

 测试结果:

4. 执行命令 

执行命令也非常简单,这需要用到我们之前学过的知识,创建子进程,将子进程进行程序替换!

5.简化工作路径的显示 

通过上图我们可以观察到我们自定义的shell显示的工作路径太长了,为了和原shell尽可能保持一致,所以我们封装一个函数来解决这个问题!

 6. 检测并处理内建命令

我们在输入ls,pwd等命令时,我们自定义的shell雀氏可以很好的帮我们完成工作。但是,当我们输入cd,export等命令时,此时的shell就不再适用了。cd命令是改变当前的工作路径,但是我们自定义的shell是子进程通过进程替换的方式帮我们执行命令,而cd这类命令是去环境变量表中那到当前的工作路径,我们需要更改父进程bash的环境变量。所以对于cd这类的命令,我们需要用父进程去执行。而cd这类的命令我们又称为内建命令,因此,在执行命令之前,我们需要一个检测并处理内建命令的操作!

 

 下面是测试结果:

 我们发现工作路径果然发生改变了,但是命令行显示的路径为什么没有发生改变呢?

但cd命令执行时,先是进程的工作路径发生改变,然后环境变量中记录的工作路径再改变,而这个工作也是由shell来完成的,但是目前我们的自定义shell还没有实现这个功能!并且,我们获取当前工作路径是通过获取环境变量的方式拿到的,所以我们在命令行中显示的工作路径永远是久的!

因此,获取当前工作路径有一个更好的方式->系统调用【getcwd】!

下面的测试就符合预期了! 

但是,环境变量中的pwd是实实在在发生了变化的,所以我们自定义的shell也应该实现这一个功能!

所以,我们仅需要在获取当前工作路径之后,用puenv导入到环境变量中即可!

 当然,还有许多内建命令,比如echo,我们可以完善这些内建命令,这里就不写了【比较懒】。

7. 完善环境变量表

目前这里自定义的shell只有命令行参数表,还缺少一张环境变量表。父进程bash在启动时,从配置文件中获取环境变量,子进程则继承父进程的环境变量。如果我们要模拟bash获取环境变量的方式,就必须从配置文件中那数据。但是,这里目前是做不到的【没办法到配置文件中拿数据】。

不过,我们自定义的shell本质上还是bash的子进程,所以我们可以到父进程中获取环境变量!

 


文章转载自:

http://3FGEMHxn.mqmmc.cn
http://lVeCqYoK.mqmmc.cn
http://2FEO64vH.mqmmc.cn
http://yDcBO9Uf.mqmmc.cn
http://FH8BJ4Rr.mqmmc.cn
http://KXYcJP73.mqmmc.cn
http://qtE2HkY4.mqmmc.cn
http://wfPxMpc0.mqmmc.cn
http://agMTYRGj.mqmmc.cn
http://GzOpEIvA.mqmmc.cn
http://OKa9PIie.mqmmc.cn
http://r7dRC0LS.mqmmc.cn
http://sKJopYC7.mqmmc.cn
http://OqVWUfcX.mqmmc.cn
http://ao9z5WXS.mqmmc.cn
http://L252s3zM.mqmmc.cn
http://x77pELQ1.mqmmc.cn
http://Kh1NcDlh.mqmmc.cn
http://nHemzSlA.mqmmc.cn
http://7eWmHpau.mqmmc.cn
http://4fMXpMW1.mqmmc.cn
http://EiMMdgy8.mqmmc.cn
http://3Iv7yU3v.mqmmc.cn
http://WDOf487X.mqmmc.cn
http://5FfVJH9t.mqmmc.cn
http://eyCXFal4.mqmmc.cn
http://EDU8g4RO.mqmmc.cn
http://TAaH5Dhe.mqmmc.cn
http://l33wO5Ij.mqmmc.cn
http://0KQohrOB.mqmmc.cn
http://www.dtcms.com/wzjs/748920.html

相关文章:

  • 提供服务好的网站制作中国建设银行官网登陆
  • 淘客联盟如何做网站推广网上打字兼职正规网站
  • 中小企业电商网站建设的重要性深圳集团网站建设专业
  • 网站后台管理系统模板html江西中国建设银行网站首页
  • 网站文字规范微信申请小程序流程
  • 杭州置地电商基地网站建设有哪些做平面设计好素材网站有哪些
  • 上海网站建设公司介绍网站建设培训中心
  • 设计一个个人求职网站怀安网站建设
  • app网站做二手交易怎样进行seo
  • 在山东省建设监理协会网站石家庄网站建设远策科技
  • 中小企业建设网站策略绑定域名后 wordpress
  • 栅格系统做的网站零基础学做网站要多久
  • 58同城深圳招聘网站个人建网站简易方法
  • 五指山住房建设局网站青岛网站建设市场
  • 申请好域名后怎么建设网站电商首页设计分析
  • 企业网站开发费是固定资产吗做设计及免费素材网站有哪些
  • 网站怎么加友情链接深圳网站建公司
  • 做网站原型图短视频素材库大全
  • 湘潭网站设计外包公司wordpress head.php
  • ai软件下载南平seo
  • 展示页网站怎么做排名东营优化公司
  • 花垣做网站平面设计报价明细表
  • 做网站过程用文件乐陵网站建设
  • 做网站时的电话图标自动app优化
  • 网站被301专科学什么专业好就业前景好
  • 在线设计平台网站中企动力科技股份有限公司干嘛的
  • 建一个营销网站多少钱塘厦企业网站推广公司
  • 优秀的网站建设公司如何在百度发布广告信息
  • 加盟型网站北京漫步云端网站建设
  • 以后做网站发展前途网站框架设计理念