• linux系统中的进程


    一、fork

    在类unix系统中,我们所执行的任何程序,都是由父进程(parent process)所产生出来的一个子进程(child process),子进程在结束后,将返回到父进程去。此一现象被称为fork

    当子进程被产生的时候,将会从父进程那里获得一定的资源分配、及(更重要的是)继承父进程的环境,也就是环境变量,但是环境变量只能从父行程到子行程单向继承。换句话说:在子行程中的环境如何变更,均不会影响父行程的环境。

    因此,在系统中,当我们用fork方式执行一个shell脚本时,其实是先产生一个sub-shell的子行程,然后sub-shell再去产生命令行的子行程。

    fork方式:

    • ./shell.sh

    • bash shell.sh

    二、source

    谓source就是让脚本在当前shell内执行而不是产生一个sub-shell来执行。

    由于所有执行结果均于当前shell内完成,若脚本的环境有所改变,当然也会改变当前环境了!

    source方式:

    • source ./shell.sh

    • . ./shell.sh

     

    三、exec

    exec也是让脚本在同一个进程上执行,但是原有进程则被结束了。简而言之:原有进程会否终止,就是exec与source/fork 的最大差异了。也就是说,原进程在exec一个新的进程之后,新的进程会代替旧的继续执行,原进程后面的语句将不被执行。

    exec 方式:

    exec ./shell.sh

    四、验证脚本

    1.sh

    #!/bin/bash
    A=B
    echo "PID for 1.sh before exec/source/fork:$$"
    export A
    echo "1.sh: $A is $A"
    case $1 in
            exec)
                    echo "using exec..."
                    exec ./2.sh ;;
            source)
                    echo "using source..."
                    . ./2.sh ;;
            *)
                    echo "using fork by default..."
                    ./2.sh ;;
    esac
    echo "PID for 1.sh after exec/source/fork:$$"
    echo "1.sh: $A is $A"

    2.sh

    #!/bin/bash
    echo "PID for 2.sh: $$"
    echo "2.sh get $A=$A from 1.sh"
    A=C
    export A
    echo "2.sh: $A is $A"

    然后,分别跑如下参数来观察结果:

    CODE:

    $ ./1.sh fork
    $ ./1.sh source
    $ ./1.sh exec

    五、参考

    1. 《shell十三问》

    (完)

    本文版权归作者(https://www.cnblogs.com/harrymore/)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,如有问题, 可邮件(harrymore@126.com)咨询.
  • 相关阅读:
    【凡尘】---react-redux---【react】
    React生命周期详解
    写文章很难,ai自动生成文章为你来排忧
    怎么用ai智能写作【智媒ai伪原创】快速写文章?
    给大家介绍个Seo伪原创工具吧,可以免费用的哈
    自媒体文章难写,在线伪原创文章生成就简单了
    内容创作难吗 不妨试试智媒ai伪原创
    Ai伪原创工具,轻松几秒出爆文
    什么AI写作软件靠谱,好用?
    分享个免费伪原创工具 关键词自动生成文章
  • 原文地址:https://www.cnblogs.com/harrymore/p/5121477.html
Copyright © 2020-2023  润新知