shell的工作原理以及模拟实现shell
来源:互联网 发布:magnet协议关联软件 编辑:程序博客网 时间:2024/06/03 20:13
1.什么是shell?
Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。
shell充当一个桥梁:
a.将使⽤者的命令翻译给核⼼(kernel)处理。
b. 同时,将核⼼的处理结果翻译给使⽤者。
2.shell的特性
(1)运行程序
shell类似于一个程序启动器,shell将程序载入内存并运行它们。
(2)管理输入和输出
使用<、>和|符号可以将输入输出重定向。这样就可以告诉shell将进程的输入和输出连接到一个文件或是其他进程。
(3)可编程
3.shell如何运行程序
shell用fork建⽴新进程,⽤execv函数簇在新进程中运⾏⽤户指 定的程序,最后shell⽤wait命令等待新进程结束。wait系统调 ⽤同时从内核取得退出状态或者信号序号以告知⼦进程是如何结束的。
4.按照上述流程模拟实现自己的shell
代码:
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
- int main()
- {
- while (1)
- {
- printf(”[SZK@localhost MyShell]#”);
- fflush(stdout);
- sleep(5);
- char cmd[128];
- ssize_t s = read(0, cmd, sizeof(cmd)-1);
- if (s>0)
- {
- cmd[s - 1] = ’\0’;
- }
- else
- {
- perror(”read”);
- return 1;
- }
- char *_argv[32];
- _argv[0] = cmd;
- char *start = cmd;
- int i = 1;
- while (*start)
- {
- if (isspace(*start))
- {
- *start = ’\0’;
- start++;
- _argv[i++] = start;
- }
- else
- {
- start++;
- }
- }
- _argv[i] = NULL;
- pid_t id = fork();
- if (id == 0)
- {//child
- execvp(_argv[0], _argv);
- exit(2);
- }
- else
- {//father
- int status = 0;
- pid_t ret = waitpid(id, &status, 0);
- if (ret>0 && WIFEXITED(status))
- {
- // printf(“wait success…exit code:%d\n”,WEXITSTATUS(status));
- }
- else
- {
- // printf(“wait filed..\n”);
- return 3;
- }
- }
- }
- return 0;
- }
程序演示效果:
但是明显可以看到运行命令cd .. 并没有产生想要的效果,那是因为Shell执行的命令可以分为内建命令(built-in)和外部命令(external),前者是构建在shell内部;后者是一个独立的文件(可以是二进制文件,也可以是一个脚本)。而cd属于内建命令,而ls属于外部命令,执行比较复杂。内建命令的性能要优于外部命令,因为它没有新建进程的开销。
5.shell如何启动
shell在你成功地登录进入系统后启动,并始终作为你与系统内核的交互手段直至你退出系统。你系统上的每位用户都有一个缺省的shell。每个用户的缺省shell在系统里的/etc/passwd文件里被指定。
6.附:exec用来程序替换的原理图
阅读全文
0 0
- shell的工作原理以及模拟实现shell
- 浅析shell的工作原理
- shell的实现原理
- Linux模拟shell的实现
- Linux的shell模拟实现
- Shell 基本工作原理
- Shell 基本工作原理
- Shell 基本工作原理
- Shell 基本工作原理
- Shell 基本工作原理
- Shell 基本工作原理
- linux下shell的工作原理
- Linux下的shell工作原理是什么?
- linux下shell的工作原理
- Linux下的Shell工作原理
- 模拟实现简易shell
- 模拟实现shell
- Linux模拟实现shell
- sql数据库简介
- 深入理解JavaScript系列(35):设计模式之迭代器模式
- TensorFlow Data Input (Part 1): Placeholders, Protobufs & Queues 占位符,原型和队列
- Unique Substrings in Wraparound String
- 初识Java,记录自己的点点滴滴!
- shell的工作原理以及模拟实现shell
- java中的常量和变量
- JavaEE系列——EJB——消息驱动bean
- XVFB实现selenium在linux上无界面运行安装篇
- 死锁(deadlock)例题解析
- jvm的线程之间的通信-notify-wait-notifyAll
- 深入理解JavaScript系列(36):设计模式之中介者模式
- 《TCP/IP详解 卷1:协议》 读书笔记 第十七章 TCP:传输控制协议
- MyBatis 映射SQL的几种方式