惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
The Register - Security
The Register - Security
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
GbyAI
GbyAI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
博客园_首页
D
Docker
S
Security @ Cisco Blogs
K
Kaspersky official blog
爱范儿
爱范儿
Simon Willison's Weblog
Simon Willison's Weblog
TaoSecurity Blog
TaoSecurity Blog
V
V2EX
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Troy Hunt's Blog
Cloudbric
Cloudbric
博客园 - 三生石上(FineUI控件)
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The Hacker News
The Hacker News
美团技术团队
S
SegmentFault 最新的问题
L
Lohrmann on Cybersecurity
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
宝玉的分享
宝玉的分享
The Last Watchdog
The Last Watchdog
Y
Y Combinator Blog
M
MIT News - Artificial intelligence
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Martin Fowler
Martin Fowler
Google Online Security Blog
Google Online Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tor Project blog
Vercel News
Vercel News
The Cloudflare Blog
G
Google Developers Blog
T
Threat Research - Cisco Blogs
AI
AI
Stack Overflow Blog
Stack Overflow Blog
I
InfoQ
Scott Helme
Scott Helme
S
Schneier on Security
大猫的无限游戏
大猫的无限游戏
The GitHub Blog
The GitHub Blog
S
Securelist
IT之家
IT之家
Microsoft Azure Blog
Microsoft Azure Blog

HaoKunT的博客

如何用 ollama 快速下载 deepseek 模型 - HaoKunT的博客 python使用gdal - HaoKunT的博客 Word中写LaTeX公式 - HaoKunT的博客 g++中的rpath和runpath - HaoKunT的博客 Ext4文件系统 - HaoKunT的博客 文件系统介绍 - HaoKunT的博客 Hyper V安装ENVI - HaoKunT的博客 华为软件实习生笔试 - HaoKunT的博客 用C++实现一个命令行进度条 - HaoKunT的博客 PCA与GWPCA - HaoKunT的博客 字节后台实习生笔试题目 - HaoKunT的博客 Web终端仿真器 - HaoKunT的博客 阿里云API网关与函数计算的基础理解 - HaoKunT的博客 函数计算搭建DNS服务器 - HaoKunT的博客 DNS解析过程 - HaoKunT的博客 Github图片加载不出来 - HaoKunT的博客 将Elementary OS装在U盘中 - HaoKunT的博客 MacOS+Windows 双系统的安装 - HaoKunT的博客 IPXE+netboot+ISCSI 网络启动 - HaoKunT的博客 Esxi+NAS+Openwrt - HaoKunT的博客 Esxi的安装和使用 - HaoKunT的博客 利用acme自动更新证书 - HaoKunT的博客 Golang使用海康威视SDK - HaoKunT的博客 Filetools工具 - HaoKunT的博客 学习正则表达式 - HaoKunT的博客 Vugu View - HaoKunT的博客 Django Restframework 嵌套序列化 - HaoKunT的博客 看不了netlify的部署日志 - HaoKunT的博客 Go Modules的使用 - HaoKunT的博客 使用hugo+netlify部署个人主页 - HaoKunT的博客 关于我 - HaoKunT的博客 在线工具大全 - HaoKunT的博客 SWIG编译海康威视SDK 使用golang - HaoKunT的博客 SWIG 以Python为例 - HaoKunT的博客 Seafile - HaoKunT的博客 Golang的小技巧 - HaoKunT的博客 归档 - HaoKunT的博客 搜索 - HaoKunT的博客
理解shell - HaoKunT的博客
HaoKunT · 2020-05-20 · via HaoKunT的博客

本文为原创文章,转载注明出处,欢迎关注网站https://hkvision.cn

缘起

最近在看《深入理解操作系统》,抛开了汇编那一块,书里面很多例子是拿Unix shell来举例的,这使得我对此有了更多的感悟,特此记录一下。

shell与终端

shell不是终端,平时容易弄混的原因是因为这两个东西总是一起出现。准确来说,单独的终端是没有任何意义的,因为这个终端只能回显你输入的一堆字符,而不能执行你输入的命令,所以一般来说,你打开一个终端之后(打开终端是处于一个进程中),同时会执行一个shell(linux中是调用execve这个函数来在一个进程中执行另外一个程序,可以先fork一个子进程,然后在这个子进程里面执行shell)。

shell做的事情

基本的shell功能就是解析用户输入的命令,解析为可执行文件,参数,环境变量等等,然后fork一份子程序,子程序调用execve函数来执行你输入的命令。此外,shell会内置一部分指令,例如quit这个指令并不是一个可执行程序,但是输入在shell中就会退出shell。

一个简单的shell包含三个不同的函数

  • parseline: parseline函数用于解析你输入的指令,参数,环境变量
  • builtin_command: builtin_command用于判断是否为内置指令,若是则直接执行内置指令,并且返回非零值,告诉eval我已经执行过了指令
  • eval: eval用于执行整体流程
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
int main() {
    while(1) {
        char cmdline[1024];
        ...
        eval(cmdline)
    }
}

void eval(char* cmdline) {
    ...
    parseline(buf, &command, &par, &eniron);
    if (builtin_command(command) == 0) {
        if (Fork() == 0) {
            ...
        }
    }
}

上面是一些伪代码,基本上可以勾画出整体的轮廓

前台与后台

这也是属于shell中的一个概念,即我的指令是放在后台执行的,前台执行的程序会阻塞shell直到程序运行完,这等于是在进入shell下一次while循环之前,就等待前台子进程执行完,直到子进程执行完后返回信号,后台程序则是不阻塞,而是注册一个信号处理函数,并将fork的子进程pid存起来,当有子进程结束的信号的时候,则对子进程pid的列表进行清理,并在前台显示子进程结束。当然你也可以选择忽略信号(默认行为),缺点是你不知道子进程到底是何时结束的。