exec 说明

Bash 中命令分为两类,外部命令和内部命令。外部命令是通过系统调用或独立的程序实现的,如 sedawk 等;内部命令是通过特殊的文件格式(.def)实现的,如 cdhistoryexec 等。

[TOC]

fork

fork 是系统的调用,用来创建子进程(child process)。子进程是父进程(parent prpcess)的一个副本,从父进程哪里获得一定的资源分配以及继承父进程的环境。子进程和父进程不同在于 pid(process id)。

环境变量只能单向从父进程传给子进程,不管子进程的环境变量怎么变化,都不会影响父进程的环境变量。

两种方法执行 script,一种是产生新的 shell,然后执行相应的 script,一种是在当前的 shell 中执行。

  1. 一般(.sh)脚本,使用 #!/bin/bash,就是第一种,先启用 sub-shell,再执行相应的命令。

  2. 另一种(source、exec),不会产生新的 shell,而是在当前的 shell 下执行命令。

exec

  1. 系统调用 exec 是以新的进程代替原来的进程,但进程的 pid 不变。因此,exec 系统调用并没有产生新的进程,只是替换原来的进程上下文,源代码的代码段、数据段、堆栈段被新的进程所替代。

  2. 一个进程主要包括

    • 一个可以执行的程序

    • 与进程关联的全部数据(变量、内存、缓存区)

    • 程序上下文

  3. exec 与 system 的区别

    • exec 是直接用新的进程去代替原来的程序远行,运行完毕之后就不会回到原来的程序中去。

    • system 是调用 shell 执行命令,system=fork+exec+waitpid,执行完毕之后,回到原先的程序中去,再继续执行下面的部分。

总结

如果使用 exec 调用,应该先 fork 一个新的进程,然后 exec。

LINUX进程控制

Last updated

Was this helpful?