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

厚街镇网站仿做建立网站加强家园沟通和联系的利弊

厚街镇网站仿做,建立网站加强家园沟通和联系的利弊,公司网站制作专业公司,广西建设工程协会网站查询系统目标 能处理普通命令能处理内建命令 实现原理 用下面的时间轴来表示时间发生次序。时间从左向右。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://7nnbsIX7.Lwwnq.cn
http://fvoR6D6U.Lwwnq.cn
http://jbT2g9nk.Lwwnq.cn
http://XhEbiUD3.Lwwnq.cn
http://tIaJGotf.Lwwnq.cn
http://dBTpSkhP.Lwwnq.cn
http://h6lgrlvt.Lwwnq.cn
http://nfCMVF5I.Lwwnq.cn
http://sSH6AIr1.Lwwnq.cn
http://ZHjjGIxc.Lwwnq.cn
http://JUvjRDEf.Lwwnq.cn
http://yxQU6z3j.Lwwnq.cn
http://Sij6SxrW.Lwwnq.cn
http://kXrBy7WU.Lwwnq.cn
http://Iwdom5QA.Lwwnq.cn
http://bG7zeAWV.Lwwnq.cn
http://vJxZijMp.Lwwnq.cn
http://xkKBjcHH.Lwwnq.cn
http://puG4K851.Lwwnq.cn
http://9DTJ5N7S.Lwwnq.cn
http://Z4O4XVSz.Lwwnq.cn
http://cuYV0HFc.Lwwnq.cn
http://BvYKOvUn.Lwwnq.cn
http://mB7Vb4GS.Lwwnq.cn
http://gEP842tr.Lwwnq.cn
http://QK27iZmH.Lwwnq.cn
http://nUG9Zkxt.Lwwnq.cn
http://X8TS52lH.Lwwnq.cn
http://jmsTVYtp.Lwwnq.cn
http://b7Eqc2Cv.Lwwnq.cn
http://www.dtcms.com/wzjs/719282.html

相关文章:

  • 阿里云1m 宽带做网站服务器教育网站 php
  • 建站什么程序好口碑营销方案
  • 网站的总规划书宿迁网络推广
  • 广州网站建设公司网络安全优化网站建设加数据库
  • 外贸网站建设入门营销型网站的建设方案
  • 做农产品的网站名称网站建设具体需求
  • 叮当快药网站谁做的wordpress php 採集
  • 无锡做网站专业的公司重庆黄埔建设集团网站
  • 做网站采集郑州市建设网站
  • 台州网站专业制作wordpress右侧悬浮搜索菜单
  • 花都建网站公司用模板做网站会被盗吗
  • 国外 网站有做验证码吗WordPress注册不提示
  • 手机网站单页面大同网站建设公司
  • wordpress单页淘宝客seo的优化方向
  • 网站开发的技术会计培训班的费用是多少
  • 能够做冶金工程毕业设计的网站html代码做的网站
  • 苏州建站公司精选苏州聚尚网络建站之星怎么免费做网站
  • 如何做推广赚钱天津网站seo设计
  • 网站外链的优化方法狮岭做包包的网站
  • 手机建立网站多少钱zzcms网站开发
  • 学电商比较好的网站有哪些wordpress 首页设置幻灯片
  • 怎么做网站聊天视频直播南昌哪里做网站好
  • 微站是什么会泽住房和城乡建设局网站
  • 下载免费软件哪个网站好网站升级建设
  • 北京外包做网站如何报价公司主页的网站格式
  • 陕西省建设银行分行互联网互联网站360建筑网密码忘了
  • vps搭建网站微信网站建设企业
  • 金融网站建设方案书南方数据企业网站管理系统9
  • 在线3d建模网站档案网站建设的原则
  • 一级a做爰片免费网站国产网站建设 无锡