简要分析下刚开始提出的第二个问题, 因为没看代码,所以只是简单流程

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)

最新文章

  1. 【BZOJ-2597】剪刀石头布 最小费用最大流
  2. js判断手机浏览器是横屏or竖屏
  3. MySQL数据库学习笔记(五)----MySQL字符串函数、日期时间函数
  4. kindeditor 操作时同步到textarea
  5. Linux下配置JDK与Tomcat
  6. [.Net MVC] 使用SQL Server数据库代替LocalDb
  7. JBehave
  8. python中如何将生成等差数列和等比数列
  9. Qt之excel 操作使用说明
  10. java开发环境配置——IDEA SVN的使用
  11. redis 持久化文章分析的很到位
  12. django中利用FastDFS来上传图片的流程
  13. Atcoder C - Vacation ( DP )
  14. 模拟curl函数
  15. 何为仿射变换(Affine Transformation)
  16. Linux内存管理--用户空间和内核空间【转】
  17. ip地址、子网掩码、DNS的关系与区别
  18. kubeadm构建k8s之Prometheus-operated监控(0.18.1)
  19. 查看linux 之mysql 是否安装的几种方法
  20. JavaSE 第二次学习随笔(四)

热门文章

  1. add-apt-repository ppa:<ppa_name>
  2. 转载:JVM内存分代策略
  3. 【php实现数据结构】单向链表
  4. nodejs+express 初学(二)
  5. 应读的paper
  6. jqGrid首次加载时不加载任何数据
  7. iOS Bezier曲线
  8. 搭建maven聚合工程包含springboot模块
  9. xshell下载免费版
  10. 用javascript实现简单的用户登录验证