• 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)

  • 相关阅读:
    POJ Area of Simple Polygons 扫描线
    POJ2828 Buy Tickets 线段树
    cf578c Weakness and Poorness 三分
    poj3737 UmBasketella 真正的三分
    POJ1061 青蛙的约会 exgcd
    POJ3090 Visible Lattice Points 欧拉函数
    P2860 [USACO06JAN]冗余路径Redundant Paths
    [JSOI2008]球形空间产生器
    [APIO2010]特别行动队
    [ZJOI2007]仓库建设
  • 原文地址:https://www.cnblogs.com/hushpa/p/5699143.html
Copyright © 2020-2023  润新知