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

网站建设新闻哈尔滨网站制作多少钱

网站建设新闻,哈尔滨网站制作多少钱,网络规划设计师岗位职责,本科自考怎么报名大家好我是沐曦希💕 文章目录一、前言二、准备工作1.输出提示符2.输入和获取命令3.shell运行原理4.内建命令5.替换三、整体代码一、前言 前面学到了进程创建,进程终止,进程等待,进程替换,那么通过这些来制作一个简易的…

大家好我是沐曦希💕

文章目录

  • 一、前言
  • 二、准备工作
    • 1.输出提示符
    • 2.输入和获取命令
    • 3.shell运行原理
    • 4.内建命令
    • 5.替换
  • 三、整体代码

一、前言

前面学到了进程创建,进程终止,进程等待,进程替换,那么通过这些来制作一个简易的Shell命令行解释器。

首先这是与Shell的互动:
在这里插入图片描述
用下图的时间轴来表示事件的发生次序。其中时间从左向右。shell由标识为sh的方块代表,它随着时间的流逝从左向右移动。shell从用户读入字符串"ls"。shell建立一个新的进程,然后在那个进程中运行ls程序并等待那个进程结束。
在这里插入图片描述
然后shell读取新的一行输入,建立一个新的进程,在这个进程中运行程序 并等待这个进程结束。所以要写一个shell,需要循环以下过程:

1. 获取命令行
2. 解析命令行
3. 建立一个子进程(fork)
4. 替换子进程(execvp)
5. 父进程等待子进程退出(wait)

二、准备工作

1.输出提示符

在这里插入图片描述
这里的提示字符为用户名@主机名 当前路径# 直接打印出来作为提示所用

printf("用户名@主机名 当前路径#");

这里没有\n,会有缓冲区的问题,类似于我们之前所说的进度条所遇到的问题,可以用fflush(stdout)刷新缓冲区。

2.输入和获取命令

  • 输入

我们需要输入一连串命令,其中可能出现空格,所以不能使用gets函数,需要用到fgets函数,同时,可以定义一个lineCommand[NUM]数组

#define NUM 1024
char lineCommand[NUM];
char* s = fgets(lineCommand,sizeof(lineCommand) - 1, stdin);
assert(s != NULL);

但是打印的时候却多换了一行,这是我们把\n也读取到了,直接进行处理即可,清除最后一个\n

lineCommand[strlen(lineCommand) - 1] = 0;

可以通过打印看看效果和测试是否有BUG

printf("test:%s\n",lineCommand);

在这里插入图片描述

  • 获取

输入之后,我们自然需要去进行获取,我们需要分割命令行,这个地方用strtok。把字符串切割成若干个子串:
strtok:第一次直接传递参数,第二次则必须传NULL。且在最终strtok会返回NULL。

在这里插入图片描述

在这里插入图片描述

3.shell运行原理

同时,在理解一下shell的运行原理:shell内部提取命令行做分析,然后调用exec. shell执行命令必须通过创建子进程,如果不创建子进程会把我们所有的shell全部替换,所以执行命令时一般磁盘上的程序必须创建子进程。

4.内建命令

我们在运行自己写的shell的时候,发现输入cd …输入cd path等命令时发现路径并没有改变!
在这里插入图片描述
没有发生改变是因为自己写的shell执行很多命令都要fork()创建子进程,让子进程执行的cd,子进程有自己的工作目录,所以更改的子进程的目录,子进程执行完毕,继续用的是父进程,既shell,并没有影响父进程,所以并没有改变。

对于cd,我们可以采用内建命令:不需要创建子进程执行,让shell自己执行命令,称为内建命令。本质就是执行系统接口,我们可以调用一个系统接口chdir,可解决上述问题:
在这里插入图片描述
在这里插入图片描述

5.替换

采用execvp进行替换进程

pid_t id = fork();
assert(id != -1);
if(id == 0)
{execvp(myargv[0],myargv);exit(1);
}

三、整体代码

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/wait.h>#include<assert.h>#include<string.h>#define NUM 1024#define OPT_NUM 64char lineCommand[NUM];char *myargv[OPT_NUM];//指针数组int lastcode = 0;int lastsig = 0;int main(){while(1){// 1.输出提示符printf("lj@VM-8-2-centos 当前路径#");fflush(stdout);// 2.获取用户输入的命令,输入的时候,用户最后还输入了\nchar* s = fgets(lineCommand,sizeof(lineCommand) - 1, stdin);assert(s != NULL);(void)s; //避免Linux认为s变量未使用,导致警告// 清除最后一个\n;例如:abcd\nlineCommand[strlen(lineCommand) - 1] = 0;//printf("test:%s\n",lineCommand);// "ls -a -l -i" -->字符串分割-->"ls" "-a" "-l" "-i"myargv[0] = strtok(lineCommand, " ");int i = 1;if(myargv[0] != NULL && (strcmp(myargv[0],"ls") == 0)){myargv[i++] = (char*)"--color=auto";}//如果没有子串了,strtok会返回NULL,即myargv[end] = NULLwhile(myargv[i++] = strtok(NULL," "));//如果是cd命令,不需要创建子进程,让shell自己执行对应的命令,本质就是执行系统接口//像这种不需要让我们的子进程来执行,而是让shell自己执行的命令—内建命令//其中echo是一个自建命令if(myargv[0] != NULL && (strcmp(myargv[0],"cd") == 0)){if(myargv[1] != NULL) chdir(myargv[1]);continue;}if(myargv[0] != NULL && myargv[1] != NULL && (strcmp(myargv[0],"echo") == 0)){if(strcmp(myargv[1],"$?") == 0){printf("%d,%d\n",lastcode,lastsig);}else{printf("%s\n",myargv[i]);}continue;}//利用条件编译测试是否成功#ifdef DEBUGfor(int i = 0; myargv[i]; ++i){printf("myargv[%d]:%s\n",i,myargv[i]);}#endif//执行命令pid_t id = fork();assert(id != -1);if(id == 0){execvp(myargv[0],myargv);exit(1);}int status = 0;pid_t ret = waitpid(id,&status,0);assert(ret > 0);(void) ret;lastcode = (status >> 8) & 0xFF;lastsig = status & 0x7F;}return 0;}

在这里插入图片描述

http://www.yayakq.cn/news/961738/

相关文章:

  • 电子商务网站建设与维护方法分析不包括为什么做免费视频网站
  • wordpress安装路径和站点地址的设置创建一个网站流程
  • 学校网站建设管理办法wordpress添加豆列
  • 做网站需要怎么样的服务器建网站教学
  • 上市的网站设计公司不花钱的网页游戏排行
  • 海南做公司网站大连市建设工程网官网
  • 织梦网站底部黑链吴桥县做网站价格
  • 网站设计网站用自己电脑做服务器 网站吗
  • 三河市建设厅公示网站如何建设学校门户网站
  • 管家网站wordpress parent id
  • 济南网站制作策划排名函数rank怎么用
  • 高端网站建设代码购物网站分为几个模块
  • 陕西企业营销型网站建设专门做婚姻法的网站
  • 网站关键词分析工具凡科建站登录官网
  • 万州微网站建设电商平台链接怎么填写
  • 网站建设费属于宣传费网络优化工程师
  • 视差 长沙做网站汕头生态建设典型案例
  • 网站前台模块包括什么网上开店的基本流程有哪些
  • 网络推广营销技巧天津seo诊断
  • 正规网站建设咨询电话网站闭站保护
  • 合肥学做网站app的学校北京市网页设计
  • 红酒网站程序建立网站目录结构应遵循的方法和建议
  • 城市建设游戏模拟网站海南网站建设设计
  • 轻松建站重庆信息门户网站
  • 代刷网站建设怎么在自己的网站上推广业务
  • dede 网站搬家腾讯云镜像安装wordpress
  • 摄像头监控设备企业网站模板手机百度高级搜索入口
  • 燕郊医院网站建设erp管理系统多少钱
  • 相城建设监理有限公司网站建设网站要不要投资钱
  • 赣州网站推广公司莆田网站建设多少钱