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

福州微信营销网站建设上海专业网站建设价

福州微信营销网站建设,上海专业网站建设价,网站建设方案范文,wordpress 主题开发教程编写自己的shell 进程程序替换 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动 例程开始执行…编写自己的shell 进程程序替换 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动 例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。替换函数 其实有几种以exec开头的函数,统称exec函数: #include unistd.h int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg, ...,char *const envp[]); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execve(const char *path, char *const argv[], char *const envp[]);解释 exec是函数替换的开头后面跟的都是多加的功能 llist的简写表示参数采用列表。 ppath的简写就是自动搜索并添加环境变量。可以使用环境变量PATH无需写全路径。 vvector的简写是可以用参数数组。 eenvironment的简写就是环境变量。就是带e都要自己组装环境变量而且是数组形式传入。 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。 如果调用出错则返回-1 所以exec函数只有出错的返回值而没有成功的返回值。 可变参数 我们刚刚可以看到int execl(const char *path, const char *arg, …); 比如 int func(int, ... ) {... }int main() {func(2, 2, 3);func(3, 2, 3, 4); }函数 func() 最后一个参数写成省略号即三个点号…省略号之前的那个参数是 int代表了要传递的可变参数的总数。为了使用这个功能您需要使用 stdarg.h 头文件该文件提供了实现可变参数功能的函数和宏。具体步骤如下 定义一个函数最后一个参数为省略号省略号前面可以设置自定义参数。 在函数定义中创建一个 va_list 类型变量该类型是在 stdarg.h 头文件中定义的。 使用 int 参数和 va_start() 宏来初始化 va_list 变量为一个参数列表。宏 va_start() 是在 stdarg.h 头文件中定义的。 使用 va_arg() 宏和 va_list 变量来访问参数列表中的每个项。 使用宏 va_end() 来清理赋予 va_list 变量的内存。 也就是说可变参数是放在传入参数最后放在中间必须在输入结束之后再输入一个NULL而且可变参数和前面放的参数类型一致。 exec调用举例 #include unistd.h int main() { char *const argv[] {ps, -ef, NULL}; char *const envp[] {PATH/bin:/usr/bin, TERMconsole, NULL}; execl(/bin/ps, ps, -ef, NULL); // 带p的可以使用环境变量PATH无需写全路径 execlp(ps, ps, -ef, NULL); // 带e的需要自己组装环境变量 execle(ps, ps, -ef, NULL, envp); execv(/bin/ps, argv); // 带p的可以使用环境变量PATH无需写全路径 execvp(ps, argv); // 带e的需要自己组装环境变量 execve(/bin/ps, argv, envp); exit(0); }事实上,只有execve是真正的系统调用,其它五个函数最终都调用 execve,所以execve在man手册 第2节,其它函数在 man手册第3节。这些函数之间的关系如下图所示。 开始写自己的shell 用下图的时间轴来表示事件的发生次序。其中时间从左向右。shell由标识为sh的方块代表它随着时间的流逝从左 向右移动。shell从用户读入字符串ls。shell建立一个新的进程然后在那个进程中运行ls程序并等待那个进程结 束。 每当输入一个命令时bash就会创建一个子进程来实现的要的命令进程上述就是ls等待子进程退出主进程继续等待命令输入和读取命令再创建子进程等… 第一步创建一个界面然后让他一直死循环 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include string.h #include fcntl.h #include ctype.h#define MAX_CMD 1024 char command[MAX_CMD]; int myshell_face() {memset(command, 0x00, MAX_CMD);printf([Tomshell$]#);fflush(stdout);if (scanf(%[^\n]%*c, command) 0){getchar();return -1;}return 0; } int main(int argc, char *argv[]) {while (1) // shell主循环{myshell_face() }return 0; } 当然这个界面是可以输入命令的但是你怎么输入都没用。 接下来是解析你输入的命令了。 把刚刚输入的命令行分析出来比如遇到空格就会再次push_back命令行数组当有空格就跳过空格知道遇到NULL为止。 char **do_parse(char *command) {int argc 0;static char *argv[32];char *ptr command;while (*ptr ! \0){if (!isspace(*ptr))//如果不是空格就一直读取命令直到遇到空格{argv[argc] ptr;while ((!isspace(*ptr)) (*ptr) ! \0)//#include ctype.h isspace检测是否遇到空格{ptr; //如果不是空格就一直读取命令直到遇到空格}}else{while (isspace(*ptr))//如果命令前几个是空格就消除空格{//*ptr \0;//这句就不用加了ptr;}}}argv[argc] NULL;return argv; }解析完之后返回的是命令行参数数组指针 开始创建子进程并且用execvp替换子进程。 int do_exec(char *command)//进程替换函数》用的就是exec {char **argv {NULL};int pid fork(); // 一切形式的进程都让子进程去办子进程就是白手套。if (pid 0){argv do_parse(command);if (argv[0] NULL){exit(-1);}execvp(argv[0], argv); // 进程替换函数可以添加环境变量ppath参数格式是数组vvector} // 可以把exec当作callgoto函数exit当作return函数。else{waitpid(pid, NULL, 0);}return 0; }这样就可以在子进程实现命令行进程了。 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include string.h #include fcntl.h #include ctype.h#define MAX_CMD 1024 char command[MAX_CMD]; int myshell_face() {memset(command, 0x00, MAX_CMD);printf([Tomshell$]#);fflush(stdout);if (scanf(%[^\n]%*c, command) 0){getchar();return -1;}return 0; } char **do_parse(char *command) {int argc 0;static char *argv[32];char *ptr command;while (*ptr ! \0){if (!isspace(*ptr))//如果不是空格就一直读取命令直到遇到空格{argv[argc] ptr;while ((!isspace(*ptr)) (*ptr) ! \0)//#include ctype.h isspace检测是否遇到空格{ptr; //如果不是空格就一直读取命令直到遇到空格}}else{while (isspace(*ptr))//如果命令前几个是空格就消除空格{//*ptr \0;//这句就不用加了ptr;}}}argv[argc] NULL;return argv; } int do_exec(char *command)//进程替换函数》用的就是exec {char **argv {NULL};int pid fork(); // 一切形式的进程都让子进程去办子进程就是白手套。if (pid 0){argv do_parse(command);if (argv[0] NULL){exit(-1);}execvp(argv[0], argv); // 进程替换函数可以添加环境变量ppath参数格式是数组vvector} // 可以把exec当作callgoto函数exit当作return函数。else{waitpid(pid, NULL, 0);}return 0; } int main(int argc, char *argv[]) {while (1) // shell主循环{if (myshell_face() 0)continue;do_exec(command);}return 0; } 最终成果
http://www.hkea.cn/news/14280300/

相关文章:

  • 品牌官方网站蚌埠网站建设文章
  • 做模型的网站有哪些黑龙江省建设工程网
  • 网站建设主流开发语言服装印花图案网站
  • 政务服务网站建设方案wordpress 更改主页
  • 免费发布信息网站大全666面包屑 wordpress
  • 做灯带的网站天津住建网官网
  • 建设银行网站 个人客户端凡科做的网站为什么搜不到
  • 烟台网站营销四川省安监站网址
  • 网站开发外包公司坑怎么做区块链网站
  • 如何加强省市网站建设个人建设网站流程
  • 个性化推荐网站开发源码建材网站制作
  • 公司网站制作方案怎么做wap网站
  • 本地网站搭建如何访问网页做统计表的网站
  • php网站搬家软件制作网页的步骤搜集素材
  • 网站的推广策略商城类网站建设方案
  • 台州快速建站公司环境设计公司排名
  • 山东省建设厅注册中心网站北京seo代理计费
  • 哪个网站做兼职猎头jsp网站建设论文
  • 简单的企业网站建设教程内蒙古建设工程信息网
  • ip做网站需要过白名单吗杭州网站排名提升
  • php就是做网站吗长兴网站建设
  • 做一个自己的网站流程广州市服务好的网站制作排名
  • 马克杯网站开发app网站制作
  • vue 做pc网站可以吗网站打开出现建设中
  • 网站备案授权书填写模板网站分析 案例
  • 辽宁网站建设电话网站速度查询
  • 建设营销网站的目的wordpress浏览pdf
  • 手机网站模版php源码天元建设集团有限公司济南第六建筑工程公司
  • 网站建设合作流程云存储做网站
  • 制作公司网站教程广州白云网站建设公司