zoukankan      html  css  js  c++  java
  • 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)咨询.
  • 相关阅读:
    PIC18F2455/2550/4455/4550之通用串行总线USB
    今天,一个新的起点
    WM_COPYDATA消息
    图片浏览(附带样式+效果)
    这条路,走远一点,再远一点
    html之table(10种表格)
    数据导出成Excel
    .net 附件下载
    .net Repeater嵌套的数据绑定问题
    AjaxPro.2.dll的使用方法,以实例讲解。
  • 原文地址:https://www.cnblogs.com/harrymore/p/5121477.html
Copyright © 2011-2022 走看看