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

网站建立的步骤/百度网址大全免费下载

网站建立的步骤,百度网址大全免费下载,可信网站认证,二次网站开发目标 能处理普通命令能处理内建命令 实现原理 用下面的时间轴来表示时间发生次序。时间从左向右。shell由标识为sh的方块,它随着时间从左向右移动。 shell从用户读入字符串“ls”。shell建立一个新的进程,然后等待进程中运行ls程序并等待进程结束。 …

目标

  • 能处理普通命令
  • 能处理内建命令

实现原理

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

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

源码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<string>#define COMMAND_SIZE 1024
#define FORMAT "[%s@%s %s]# "//下面是shell定义的全局数据
// 1.命令行参数表
#define MAXARGC 128
char *g_argv[MAXARGC];
int g_argc = 0;// 2.环境变量表
#define MAX_ENV 100
char* g_env[MAX_ENV];
int g_envs = 0;char cwd[1024];
char cwdenv[1024];// last code exit
int lastcode = 0;const char* GetUserName()
{const char* name=getenv("USER");return name == NULL ? "None" : name;
}const char* GetHostName()
{const char* host=getenv("HOSTNAME");return host == NULL ? "None" : host;
}const char* GetPwd()
{//const char* pwd=getenv("PWD");const char* pwd = getcwd(cwd,sizeof(cwd));if(pwd != NULL){snprintf(cwdenv,sizeof(cwdenv),"PWD=%s",cwd);putenv(cwdenv);}return pwd == NULL ? "None" : pwd;
}const char* GetHome()
{const char* home=getenv("HOME");return home == NULL ? "None" : home;
}const char* GetOldpwd()
{const char* oldpwd=getenv("OLDPWD");return oldpwd == NULL ? "None" : oldpwd;
}// 处理目录
std::string DirName(const char* pwd)
{
#define SLASH "/"std::string dir = pwd;if(dir == SLASH) return SLASH;auto pos = dir.rfind(SLASH);if(pos == std::string::npos) return pwd;return dir.substr(pos+1);
}void InitEnv()
{extern char** environ;memset(g_env,0,sizeof(g_env));g_envs = 0;//简化操作,从父进程获得环境变量for(int i = 0; environ[i]; i++){g_env[i]=(char*)malloc(strlen(environ[i])+1);strcpy(g_env[i],environ[i]);g_envs++;}g_env[g_envs] = NULL;//2.导成环境变量for(int i = 0; g_env[i]; i++){putenv(g_env[i]);}environ = g_env;
}void MakeCommandLine(char cmd_prompt[], int size)
{snprintf(cmd_prompt, size, FORMAT, GetUserName(), GetHostName(), DirName(GetPwd()).c_str());
}void PrintfCommandPrompt()
{char command[COMMAND_SIZE];MakeCommandLine(command,COMMAND_SIZE);printf("%s",command);fflush(stdout);
}// ls -a -l => "ls -a -l"字符串
bool GetCommandLine(char* out, int size)
{char* c = fgets(out, size, stdin);if(c==NULL) return false;out[strlen(out)-1]=0; // 清理\nif(strlen(out) <= 0) return false;return true;
}// 命令行分析 "ls -a -l" => "ls" "-a" "-l"
bool CommandParse(char* commandline)
{
#define SEP " "g_argc = 0;g_argv[g_argc++] = strtok(commandline, SEP);while((bool)(g_argv[g_argc++] = strtok(nullptr,SEP)));g_argc--;return g_argc > 0 ? true :false;
}// command
bool cd()
{//cdif(g_argc == 1){std::string home = GetHome();if(home.empty()) return true;chdir(home.c_str());}else {std::string where = g_argv[1];//cd ~if(where == "~"){std::string home = GetHome();chdir(home.c_str());}//cd -if(where == "-"){std::string oldpwd = GetOldpwd();chdir(oldpwd.c_str());}chdir(where.c_str());}return true;
}
void PrintEnv()
{extern char** environ;for(int i = 0; environ[i];++i){printf("%-2d->%s\n",i,environ[i]);}
}bool CheckAndExcuteBuildin()
{std::string cmd = g_argv[0];if(cmd == "cd"){cd();return true;}if(cmd == "test"){PrintEnv();return true;}return false;
}void Excute()
{pid_t id = fork();if(id == 0) // child{execvp(g_argv[0], g_argv);exit(1);}// fatherint status = 0;pid_t rid = waitpid(id,&status,0);if(rid > 0){lastcode=WEXITSTATUS(status);        }
}void test_GetCommandLine(char* str)
{printf("%s\n", str);
}
void test_CommandParse()
{for(int i = 0; i < g_argc; ++i)std::cout << g_argv[i] << " " ;
}
void test_InitEnv()
{for(int i = 0; g_env[i]; i++){printf("env[%2d]->%s\n",i,g_env[i]);}printf("envs: %d\n",g_envs);
}int main()
{InitEnv();while(true){// 1. 输出命令行提示符  [jfs@superg-alicloud myshell]$PrintfCommandPrompt();// 2. 获取用户输入的命令 ls -a -lchar commandline[COMMAND_SIZE];if(!GetCommandLine(commandline, sizeof(commandline))) continue;//test_GetCommandLine(commandline);// 3. 命令行分析,"ls -a -l" => "ls" "-a" "-l"if(!CommandParse(commandline))continue;//test_CommandParse();// 4.检测并处理内建命令if(CheckAndExcuteBuildin())continue;// 5. 执行命令Excute();}return 0;
}
http://www.whsansanxincailiao.cn/news/31958472.html

相关文章:

  • 南京建站推广公司/产品推广计划方案
  • dw网站怎么做背景图/中国制造网网站类型
  • asp+sql server典型网站建设案例(源码)3/惠州网络营销
  • 企业推广活动/南宁求介绍seo软件
  • 简洁风格的网站模板免费下载/爱站网官网
  • 刚做的网站怎么搜索不出来/app推广方式
  • 网站建设三站合一/百度公司高管排名
  • 网站建设必会的软件有哪些/bt磁力猫
  • 58同城东莞招聘/好搜seo软件
  • 望京做网站公司/网络营销公司排行榜
  • 广州高端网站建设公司/游戏优化软件
  • 做网站需要了解什么东西/营销型企业网站建设的内容
  • 北京高端网站建设制作设计/灰色词快速排名接单
  • 高师本科化学实验教学体系建设与创新型人才培养 教学成果奖申报网站/营销网站建设培训学校
  • 博物馆网站 微信 微博 建设方案/网站建设流程是什么
  • 网站建设费可以计入管理费用吗/优化步骤
  • 网站搭建要多少钱/有产品怎么找销售渠道
  • 做网站赚取广告费/厦门seo公司
  • 党建网站建设成效/友妙招链接
  • 如归网络营销推广企业/北京优化seo排名
  • 建设网站出现400错误/torrentkitty磁力猫
  • 江西建设厅网站财务部/网站友情链接查询
  • wordpress http https/优化网址
  • 做网站公司未来的发展方向/南宁百度seo排名优化软件
  • 榆林做网站电话/cnn头条新闻
  • 萝岗高端网站建设/最好的推广平台排名
  • 网站用户运营/湖南专业关键词优化
  • 网站运营每天做啥工作/中国世界排名
  • 政府网站加强意识形态阵地建设/软文街怎么样
  • 做的美食视频网站/如何用手机制作网站