exec 说明
Bash 中命令分为两类,外部命令和内部命令。外部命令是通过系统调用或独立的程序实现的,如 sed
、awk
等;内部命令是通过特殊的文件格式(.def)实现的,如 cd
、history
、exec
等。
[TOC]
fork
fork
是系统的调用,用来创建子进程(child process)。子进程是父进程(parent prpcess)的一个副本,从父进程哪里获得一定的资源分配以及继承父进程的环境。子进程和父进程不同在于 pid(process id)。
环境变量只能单向从父进程传给子进程,不管子进程的环境变量怎么变化,都不会影响父进程的环境变量。
两种方法执行 script,一种是产生新的 shell,然后执行相应的 script,一种是在当前的 shell 中执行。
一般(.sh)脚本,使用
#!/bin/bash
,就是第一种,先启用 sub-shell,再执行相应的命令。另一种(source、exec),不会产生新的 shell,而是在当前的 shell 下执行命令。
exec
系统调用 exec 是以新的进程代替原来的进程,但进程的 pid 不变。因此,exec 系统调用并没有产生新的进程,只是替换原来的进程上下文,源代码的代码段、数据段、堆栈段被新的进程所替代。
一个进程主要包括
一个可以执行的程序
与进程关联的全部数据(变量、内存、缓存区)
程序上下文
exec 与 system 的区别
exec 是直接用新的进程去代替原来的程序远行,运行完毕之后就不会回到原来的程序中去。
system 是调用 shell 执行命令,
system=fork+exec+waitpid
,执行完毕之后,回到原先的程序中去,再继续执行下面的部分。
总结
如果使用 exec 调用,应该先 fork 一个新的进程,然后 exec。
Last updated
Was this helpful?