Linux上编辑然后执行一段脚本的机制
简要分析下刚开始提出的第二个问题, 因为没看代码,所以只是简单流程
1. 在bash里打开vim编辑文件并保存退出:
bash进程fork子进程, 然后调用exec装入vim程序,wait这个子进程
vim进程打开文件: fd = open系统调用
用户输入:- io中断 - 字符显示 - 存入缓冲区
保存: 缓冲区数据 write系统调用写入文件
退出: 关闭fd,退出vim进程
回到bash进程
2. bash中执行shell脚本, 如执行下面的脚本文件my.sh:
#!/bin/sh
cd .
ps -o pid,pgid,ppid,sid,tty,comm
流程:
bash进程fork子进程+调用exec执行脚本,并且wait这个子进程结束;
内核检查脚本第一行是否指定了解释器(如#!/bin/sh), 如果有,子进程会装入sh解释器程序,相当于运行/bin/sh my.sh
这个sh进程从内存中读取脚本命令:
如果是内建命令(如cd),解释器会调用相关函数执行;
如果是外部命令(如ps),sh进程fork子进程+调用exec装入ps程序执行,并且等待ps进程结束。
ps进程打印输出,进程结束,回到sh进程
sh执行完毕,进程结束,回到bash进程
bash进程继续执行,打印提示符等待输入
脚本执行结果:
$ ./my.sh
PID PGID PPID SID TT COMMAND
2162 2162 2161 2162 pts/11 bash
3030 3030 2162 2162 pts/11 my.sh
3031 3030 3030 2162 pts/11 ps
可以看出(PPID),ps parent进程是my.sh, my.sh parent是bash. my.sh和ps进程属于一个进程组(PGID)
最新文章
- 【BZOJ-2597】剪刀石头布 最小费用最大流
- js判断手机浏览器是横屏or竖屏
- MySQL数据库学习笔记(五)----MySQL字符串函数、日期时间函数
- kindeditor 操作时同步到textarea
- Linux下配置JDK与Tomcat
- [.Net MVC] 使用SQL Server数据库代替LocalDb
- JBehave
- python中如何将生成等差数列和等比数列
- Qt之excel 操作使用说明
- java开发环境配置——IDEA SVN的使用
- redis 持久化文章分析的很到位
- django中利用FastDFS来上传图片的流程
- Atcoder C - Vacation ( DP )
- 模拟curl函数
- 何为仿射变换(Affine Transformation)
- Linux内存管理--用户空间和内核空间【转】
- ip地址、子网掩码、DNS的关系与区别
- kubeadm构建k8s之Prometheus-operated监控(0.18.1)
- 查看linux 之mysql 是否安装的几种方法
- JavaSE 第二次学习随笔(四)