exec函数允许将一个可执行程序进程的控制转移到另一个可执行程序的进程上。
exec调用并没有生成新的进程,而是在原有进程的基础上,替换原有进程的正文,调用前后是同一个进程,进程的PID不变。
在Linux中并没有名为exec的函数,它们只有一个系统调用:execve.库提供的所有函数只有这个系统调用的封装。
execve系统调用可以查找指定的文件,这里主要有三种可执行文件,第一是可执行脚本,第二是可执行目标文件,第三是二进制文件。
二)脚本中fork/exec/source之间的区别:
通过以下的脚本对这三种方式进行说明:
more test1.sh test2.sh
::::::::::::::
test1.sh
::::::::::::::
#!/bin/bash
var1=“OLD_VALUE”
export var1
echo “PID for test1.sh before exec/source/fork:$$”
echo “test.sh: \$var1 is $var1”
case $1 in
exec)
echo “using exec.。.”
exec 。/test2.sh
;;
source)
echo “using source.。.”
source 。/test2.sh
;;
*)
echo “using fork.。.”
。/test2.sh
esac
echo -e “\n\rPID for test1.sh after exec/source/fork;$$”
echo “test1.sh \$var1 is $var1”
::::::::::::::
test2.sh
::::::::::::::
#!/bin/bash
echo -e “\r\nPID for test2.sh; $$”
echo “test2.sh get \$var1=$var1 from test2.sh”
var1=“NEW_VALUE”
export var1
echo “test2.sh: \$var1 is $var1”