`
truemylife
  • 浏览: 230887 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

linux中fork, source和exec的区别

阅读更多

原文地址http://blog.chinaunix.net/uid-23622436-id-3222317.html

shell的命令可以分为内部命令和外部命令. 内部命令是由特殊的文件格式.def实现的,如cd,ls等.而外部命令是通过系统调用或独立程序实现的,如awk,sed. source和exec都是内部命令.

fork
   使用 fork 方式运行 script 时, 就是让 shell(parent process) 产生一个 child process 去执行该 script, 当 child process 结束后, 会返回 parent process,但 parent process 的环境是不会因 child process 的改变而改变的.

source
   使用 source 方式运行 script 时, 就是让 script 在当前 process 内执行, 而不是产生一个 child process 来执行. 由于所有执行结果均于当前 process 内完成,若 script 的环境有所改变, 当然也会改变当前 process 环境了.
source ./my.sh 或 . ./my.sh
 
exec
   使用 exec 方式运行script时, 它和 source 一样, 也是让 script 在当前process内执行, 但是 process 内的原代码剩下部分将被终止. 同样, process 内的环境随script 改变而改变.

结论:通常如果我们执行时,都是默认为fork的。大家可以通过pstree命令看看关于父子进程的关系。如上,如果想让父进程得到子进程的环境变量,就是source方式了

* fork ( /directory/script.sh)
    fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本.运行的时候开一个sub-shell执行调用的脚 本,sub-shell执行的时候, parent-shell还在。sub-shell执行完毕后返回parent-shell. sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell
* source (source /directory/script.sh)
   与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.
* exec (exec /directory/script.sh)
    exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本. 被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别

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"

然后,分別跑如下参数来观察结果:
$ ./1.sh fork
$ ./1.sh source
$ ./1.sh exec

分享到:
评论

相关推荐

    Linux中的C编程

    C语言在Linux下可以创建和管理进程,如通过fork()创建新进程,使用exec()系列函数执行新程序,通过wait()等待子进程结束。线程(pthread)编程则涉及pthread_create()、pthread_join()等函数,以实现多线程并发执行...

    linux c实例集合

    5. **进程和线程**:在Linux下,`fork()`创建子进程,`exec()`家族函数用来执行新的程序。`pthread_create()`和`pthread_join()`用于多线程编程。 6. **信号处理**:`signal()`和`sigaction()`函数用于处理系统发送...

    最新版本linux libc库实现源码

    5. **进程管理**:包括`fork`, `exec`, `wait`等函数,它们用于创建、控制和通信进程。源码会揭示如何在用户空间和内核空间之间切换。 6. **网络编程**:`socket`, `bind`, `connect`, `accept`等网络函数,这些是...

    linux-c.zip_C语言_Linux C语言_linux_linux-c

    常见的系统调用包括:`fork`用于创建进程,`exec`系列用于执行新程序,`wait`和`waitpid`用于等待子进程结束,`open`、`close`、`read`和`write`用于文件操作,以及`pipe`和`socket`用于进程间通信。理解并熟练运用...

    linux系统下C程序开发详解源代码(徐磊著)

    本文将深入探讨Linux环境下C语言编程的核心概念、工具和实践方法,结合《Linux系统下C程序开发详解》(徐磊著)一书中的源代码,帮助读者更好地理解和掌握相关知识。 首先,理解C语言的基础是必要的。C语言是一种...

    Linux+C编程实战源码

    4. **进程与线程**:C语言在Linux中可以通过`<sys/types.h>`和`<unistd.h>`头文件中的函数来管理进程和线程,如`fork()`、`pthread_create()`等。 5. **信号处理**:`signal()`函数允许程序响应特定的系统事件,如...

    GNU/Linux环境编程第二版 源码

    4. **进程和线程管理**:`fork()`, `exec()`系列函数用于创建和替换进程,`wait()`和`waitpid()`用于等待子进程结束。多线程编程中,`pthread_create()`、`pthread_join()`和互斥锁(`pthread_mutex_t`)等用于线程的...

    linux C编程 课件

    Linux提供了一系列的系统调用来实现这些功能,例如`open()`、`read()`、`write()`用于文件操作,`fork()`、`exec()`、`wait()`用于进程控制,`signal()`处理信号,`pipe()`、`socket()`等用于进程间通信。...

    linux内核 0.11版本源码 带中文注释

    * 实际上只有pause 和fork 需要使用内嵌方式,以保证从main()中不会弄乱堆栈,但是我们同时还 * 定义了其它一些函数。 */ static inline _syscall0 (int, fork) // 是unistd.h 中的内嵌宏代码。以嵌入汇编的形式...

    linux环境下的c编程

    7. **进程与线程**:在Linux环境中,可以使用`fork`创建新进程,`exec`加载新的程序映像,`wait`等待子进程结束。多线程编程则涉及`pthread_create`, `pthread_join`等函数,用于实现并发执行。 8. **信号处理**:...

    unix实验系统调用

    unix实验基础内容:系统调用assignments...before you download and compile the linux kernel source, make sure you have development tools installed on your system. in CentOS, install these software using yum

    linux c编程源码

    6. **进程和线程**:Linux是一个多任务操作系统,C语言提供了`fork`、`exec`系列函数创建和管理进程,`pthread`库用于线程操作。理解进程和线程的概念以及它们之间的关系对编写并发程序至关重要。 7. **信号和异常...

    Linux操作系统下C语言编程入门

    Linux提供了丰富的系统调用来管理进程,如fork()用于创建新进程,exec()用于执行新程序,wait()用于等待子进程结束等。 3. 文件操作 Linux环境下,C语言可以通过标准库函数如fopen()、fread()、fwrite()、fclose()...

    Linux 上的C编程

    这本书“Linux上的C编程”针对初学者,通过丰富的实例和透彻的分析,旨在帮助读者快速掌握在Linux环境中使用C语言编程的核心概念和技术。 1. **Linux基础知识**:Linux是一种开源操作系统,基于Unix,它提供了...

    linux环境下c编程指南源码

    4. **系统调用**:Linux提供了丰富的系统调用接口,如`fork`用于创建子进程,`exec`系列函数用于执行新的程序,`waitpid`等待子进程结束,`pipe`和`socket`用于进程间通信。 5. **信号处理**:通过`signal`函数可以...

    linux下c语言开发

    6. **进程和线程**:在Linux下,C语言可以利用`fork`创建子进程,`exec`系列函数替换子进程的执行映像,`wait`等待子进程结束。`pthread`库则支持多线程编程,包括`pthread_create`创建线程、`pthread_join`等待线程...

    linux 下 C编程电子书

    比如,`fork`创建子进程,`exec`系列函数执行新程序,`pipe`和`socket`实现进程间通信,`malloc`和`free`管理动态内存。 5. **信号处理**: - C语言在Linux中可以捕获和处理信号,例如`SIGINT`(中断)和`SIGTERM`...

    linux_unix_shell

    2. **进程控制**:使用fork、exec和wait等函数创建和管理子进程,实现复杂的进程间通信。 3. **错误处理**:通过set -e选项,可以设定脚本在遇到错误时立即退出,提高脚本的健壮性。 4. **脚本调试**:使用set -x...

    猪哥的嵌入式linux公房菜

    - **进程管理**:fork、exec、wait等。 **4. 主流嵌入式Linux动态扩展技术比较分析** - **动态加载**:按需加载模块。 - **热插拔技术**:设备即插即用的支持。 **5. Linux动态库剖析** - **加载机制**:动态链接...

    Linux_shell_编程入门(对外版091022)

    8. **进程控制**:学习如何在Shell脚本中启动、停止、监控和管理进程,如fork、exec、wait等。 9. **函数和参数**:了解如何在脚本中定义和调用函数,以及如何传递参数给脚本和函数。 10. **错误处理和调试**:...

Global site tag (gtag.js) - Google Analytics