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

中央广播电视总台中国之声seoul怎么读

中央广播电视总台中国之声,seoul怎么读,有几个网站打不开,做代理需要自己的网站吗文章目录 0.准备工作1.大体框架 一、获取命令行二、解析命令行三、进程执行1.普通命令2.内建命令 四、完整代码&#xff1a; 0.准备工作 1.大体框架 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <u…

文章目录

  • 0.准备工作
    • 1.大体框架
  • 一、获取命令行
  • 二、解析命令行
  • 三、进程执行
    • 1.普通命令
    • 2.内建命令
  • 四、完整代码:


0.准备工作

在这里插入图片描述

1.大体框架

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>#define LEFT "["
#define RIGHT "]"
#define LABLE "#"
#define DELIM " \t"
//用于修饰命令行
//类似:[hh@VM-4-10-centos ~]$ #define LINE_SIZE 1024//输入命令最大长度
#define ARGC_SIZE 32//命令行参数表的大小
#define EXIT_CODE 44//退出码int lastcode = 0;//上一次的退出码
int quit = 0char commandline[LINE_SIZE];//输入的命令
char *argv[ARGC_SIZE];//解析后保存的命令
char pwd[LINE_SIZE];//保存当前所在路径// 自定义环境变量表
char myenv[LINE_SIZE];//因为环境变量表里面保存的不是//变量本身,而是其地址,所以我们为了防止//自己导入的环境变量被覆盖,需要自己维护一段空间//这里myenv只能维护一个环境变量,因为只有一个地址const char *getusername()
{//获取用户名return getenv("USER");
}const char *gethostname()
{//获取主机名return getenv("HOSTNAME");
}void getpwd()
{
//将当前路径保存到pwd中getcwd(pwd, sizeof(pwd));
}void interact(char *cline, int size){ }//获取命令行int splitstring(char cline[], char *_argv[]){}//解析命令行void NormalExcute(char *_argv[]){}//执行普通命令int buildCommand(char *_argv[], int _argc){}//执行内键命令int main()
{while(!quit){// 1.// 2. 交互问题,获取命令行 interact(commandline, sizeof(commandline));// 3. 子串分割的问题,解析命令行int argc = splitstring(commandline, argv);if(argc == 0) continue;// 4. 指令的判断 //内键命令,本质就是一个shell内部的一个函数int n = buildCommand(argv, argc);// 5. 普通命令的执行if(!n) NormalExcute(argv);}return 0;
}

一、获取命令行

在获取命令之前我们需要先建立一个命令行
类似这种效果:在这里插入图片描述

void interact(char *cline, int size)
{getpwd();//将当前路径写入到pwd中printf(LEFT"%s@%s %s"RIGHT""LABLE" ", getusername(), gethostname(), pwd);fgets(cline, size, stdin);//这里不用scanf的原因是其遇到空格与回车不会读取//所以我们选择用fgets,将命令写入cline中// "abcd\n\0"//又因为fgets会读入回车键,所以我们要手动把回车位置改为'\0'cline[strlen(cline)-1] = '\0';
}

二、解析命令行

int splitstring(char cline[], char *_argv[])
{int i = 0;//strtok用于分割字符串,上面我们宏定义了只有要DELIM中的字符//就会发生分割,将分割后的字符串写入argv中argv[i++] = strtok(cline, DELIM);while(_argv[i++] = strtok(NULL, DELIM)); // 故意写的=return i - 1;//返回argv中存的字符串个数
}

三、进程执行

1.普通命令

void NormalExcute(char *_argv[])
{pid_t id = fork();//创建子进程if(id < 0){perror("fork");return;}else if(id == 0){//让子进程执行命令//execvp相当于一个加载器//该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行//会从环境变量中的路径中找到我们的可执行程序execvp(_argv[0], _argv);exit(EXIT_CODE);}else{int status = 0;pid_t rid = waitpid(id, &status, 0);if(rid == id) {//等待子进程成功,更改退出码lastcode = WEXITSTATUS(status);}}
}

2.内建命令

在这里插入图片描述

int buildCommand(char *_argv[], int _argc)
{if(_argc == 2 && strcmp(_argv[0], "cd") == 0){//chdir改变当前进程路径//假如我们让子进程执行cd命令,子进程确实路径改变了//但子进程执行完就被父进程回收了,没屁用//因为进程的独立性我父进程路径不受影响。//所以我们要手动修改路径chdir(argv[1]);getpwd();//将新的路径写入pwd//改变环境变量PWD,用pwd对其进行写入sprintf(getenv("PWD"), "%s", pwd);return 1;}else if(_argc == 2 && strcmp(_argv[0], "export") == 0){//自己维护环境变量空间strcpy(myenv, _argv[1]);//将环境变量放入自己的myenvputenv(myenv);return 1;}else if(_argc == 2 && strcmp(_argv[0], "echo") == 0){if(strcmp(_argv[1], "$?") == 0){printf("%d\n", lastcode);lastcode=0;}else if(*_argv[1] == '$'){//_argv[1]+1为$后面的值例如$PATH//那么最后就获取PATH的值char *val = getenv(_argv[1]+1);if(val) printf("%s\n", val);}else{printf("%s\n", _argv[1]);}return 1;}// 特殊处理一下ls//因为ls中如果是可执行文件,其会显示为特殊颜色if(strcmp(_argv[0], "ls") == 0){_argv[_argc++] = "--color";_argv[_argc] = NULL;}return 0;
}

四、完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>#define LEFT "["
#define RIGHT "]"
#define LABLE "#"
#define DELIM " \t"
#define LINE_SIZE 1024
#define ARGC_SIZE 32
#define EXIT_CODE 44int lastcode = 0;
int quit = 0;
extern char **environ;
char commandline[LINE_SIZE];
char *argv[ARGC_SIZE];
char pwd[LINE_SIZE];// 自定义环境变量表
char myenv[LINE_SIZE];const char *getusername()
{return getenv("USER");
}const char *gethostname()
{return getenv("HOSTNAME");
}void getpwd()
{getcwd(pwd, sizeof(pwd));
}void interact(char *cline, int size)
{getpwd();printf(LEFT"%s@%s %s"RIGHT""LABLE" ", getusername(), gethostname(), pwd);fgets(cline, size, stdin);// "abcd\n\0"cline[strlen(cline)-1] = '\0';
}int splitstring(char cline[], char *_argv[])
{int i = 0;argv[i++] = strtok(cline, DELIM);while(_argv[i++] = strtok(NULL, DELIM));  return i - 1;
}void NormalExcute(char *_argv[])
{pid_t id = fork();if(id < 0){perror("fork");return;}else if(id == 0){//让子进程执行命令//execvpe(_argv[0], _argv, environ);execvp(_argv[0], _argv);exit(EXIT_CODE);}else{int status = 0;pid_t rid = waitpid(id, &status, 0);if(rid == id) {lastcode = WEXITSTATUS(status);}}
}int buildCommand(char *_argv[], int _argc)
{if(_argc == 2 && strcmp(_argv[0], "cd") == 0){chdir(argv[1]);getpwd();sprintf(getenv("PWD"), "%s", pwd);return 1;}else if(_argc == 2 && strcmp(_argv[0], "export") == 0){strcpy(myenv, _argv[1]);putenv(myenv);return 1;}else if(_argc == 2 && strcmp(_argv[0], "echo") == 0){if(strcmp(_argv[1], "$?") == 0){printf("%d\n", lastcode);lastcode=0;}else if(*_argv[1] == '$'){char *val = getenv(_argv[1]+1);if(val) printf("%s\n", val);}else{printf("%s\n", _argv[1]);}return 1;}// 特殊处理一下lsif(strcmp(_argv[0], "ls") == 0){_argv[_argc++] = "--color";_argv[_argc] = NULL;}return 0;
}int main()
{while(!quit){// 1.// 2. 交互问题,获取命令行  interact(commandline, sizeof(commandline));// 3. 子串分割的问题,解析命令行int argc = splitstring(commandline, argv);if(argc == 0) continue;// 4. 指令的判断 //内键命令,本质就是一个shell内部的一个函数int n = buildCommand(argv, argc);// 5. 普通命令的执行if(!n) NormalExcute(argv);}return 0;
}

文章转载自:
http://flair.c7500.cn
http://wharfinger.c7500.cn
http://cocksure.c7500.cn
http://crabbily.c7500.cn
http://jujube.c7500.cn
http://violoncello.c7500.cn
http://neurotic.c7500.cn
http://bantingize.c7500.cn
http://trigynous.c7500.cn
http://machinability.c7500.cn
http://quickthorn.c7500.cn
http://transferability.c7500.cn
http://midweek.c7500.cn
http://flagleaf.c7500.cn
http://philtrum.c7500.cn
http://speculum.c7500.cn
http://lysozyme.c7500.cn
http://divingde.c7500.cn
http://monotechnic.c7500.cn
http://zooplastic.c7500.cn
http://henpecked.c7500.cn
http://mimetic.c7500.cn
http://twopenny.c7500.cn
http://cardiography.c7500.cn
http://duoplasmatron.c7500.cn
http://parameter.c7500.cn
http://phyllotactic.c7500.cn
http://menfolk.c7500.cn
http://panleucopenia.c7500.cn
http://irdp.c7500.cn
http://gomphiasis.c7500.cn
http://vallum.c7500.cn
http://unrelenting.c7500.cn
http://fasciola.c7500.cn
http://gazar.c7500.cn
http://sank.c7500.cn
http://perceval.c7500.cn
http://bey.c7500.cn
http://evildoing.c7500.cn
http://calking.c7500.cn
http://gprs.c7500.cn
http://eudora.c7500.cn
http://christcross.c7500.cn
http://unsubsidized.c7500.cn
http://implementary.c7500.cn
http://vesuvianite.c7500.cn
http://lotto.c7500.cn
http://cyclopedist.c7500.cn
http://departed.c7500.cn
http://quorum.c7500.cn
http://demonism.c7500.cn
http://acutance.c7500.cn
http://altar.c7500.cn
http://baseplate.c7500.cn
http://irremissible.c7500.cn
http://citrange.c7500.cn
http://should.c7500.cn
http://endonuclease.c7500.cn
http://firebrand.c7500.cn
http://lorn.c7500.cn
http://hidebound.c7500.cn
http://codicology.c7500.cn
http://lobelia.c7500.cn
http://heretofore.c7500.cn
http://raze.c7500.cn
http://etesian.c7500.cn
http://louvar.c7500.cn
http://scarbroite.c7500.cn
http://ussuriisk.c7500.cn
http://spectrophotometer.c7500.cn
http://afeared.c7500.cn
http://legislation.c7500.cn
http://outgiving.c7500.cn
http://spokeswoman.c7500.cn
http://arabica.c7500.cn
http://inconclusive.c7500.cn
http://gasometer.c7500.cn
http://civet.c7500.cn
http://gallate.c7500.cn
http://earom.c7500.cn
http://extraordinary.c7500.cn
http://zesty.c7500.cn
http://quadrode.c7500.cn
http://tamarind.c7500.cn
http://pleiotypic.c7500.cn
http://intima.c7500.cn
http://drawnwork.c7500.cn
http://sparse.c7500.cn
http://steadfastly.c7500.cn
http://unseaworthy.c7500.cn
http://escritoire.c7500.cn
http://dropping.c7500.cn
http://teemless.c7500.cn
http://australite.c7500.cn
http://hasid.c7500.cn
http://lak.c7500.cn
http://dichasium.c7500.cn
http://candour.c7500.cn
http://deexcite.c7500.cn
http://pschent.c7500.cn
http://www.zhongyajixie.com/news/52509.html

相关文章:

  • 日本wifi网站seo在中国
  • wordpress怎么让手机端好看seo软件推广哪个好
  • 做自媒体那几个网站好点株洲seo优化公司
  • 北京网站建seo销售好做吗
  • 建设淘宝网站培训机构学校
  • 复旦学霸张立勇做的有关寺庙网站彼亿营销
  • 广州网站建设出售seo没什么作用了
  • 昆明微网站建设百度推广销售话术
  • 正规的营销型网站建设宁波seo排名外包
  • 中国电子系统建设公司网站苏州网站制作开发公司
  • 做网站的北京西安做网站哪家好
  • 网站将要准备建设的内容外贸互联网推广的
  • 铁岭网站制作百度搜索风云榜手机版
  • 转业做网站的工具百度退推广费是真的吗
  • 精品域名更换关键词优化怎么优化
  • 学校网站建设机构新闻今天最新消息
  • 佛山做网站哪家公司最好济南网站seo公司
  • iis网站目录权限优化方案电子版
  • 大余网站建设我是新手如何做电商
  • b2b网站20180409网站怎么建立
  • 网站制作原理steam交易链接在哪复制
  • 手机兼职平台app排行榜前十名水平优化
  • 网站初期缺点2345网址大全浏览器
  • 建设门户网站 业务模板网建公司
  • 推广外贸网站百度提交入口网址是指在哪里
  • 设计素材网站花瓣市场营销策划方案案例
  • 网站开发什么语言好百度软件中心下载
  • 如何做静态页网站外链平台
  • 国内做免费视频网站有哪些下载百度2023最新版安装
  • php网站开发技术论文免费网站注册免费创建网站