zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    [数据结构]直接插入排序
    隐藏小程序scroll-view组件的滚动条
    当 uni-app 遇见 vscode
    npm(你怕吗) 全局安装与本地安装、开发依赖和生产依赖
    Vue-resource的使用
    spy-debugger调试、抓包工具
    一个小时学会Git
    flex布局踩过的坑
    Html5移动端布局及(rem布局)页面自适应布局详解
    使用vscode自动编译less
  • 原文地址:https://www.cnblogs.com/hushpa/p/5699143.html
Copyright © 2011-2022 走看看