system和exec的区别
一、system和exec的区别:
1、system()和exec()都可以执行进程外的命令,system是在原进程上开辟了一个新的进程,但是exec是用新进程(命令)覆盖了原有的进程。
2、system()和exec()都有能产生返回值,system的返回值并不影响原有进程,但是exec的返回值影响了原进程。
3、system需要先启动一个shell才能运行指定的命令,调用system函数执行指定命令时,原进程会暂停等待,之后再继续进行;调用exec函数开启新进程后,原进程将被直接关闭。
二、子进程(child process)和子shell(subshell)
1、子进程
子进程很好理解,就是Unix和C语言中传统意义上的fork+exec。所有外部的命令(包括运行bash这样的命令和./script.sh这样的脚本)都是以新的子进程的方式创建的。子进程只继承被export的环境变量,不继承alias和定义的function。子进程一定会被分配新的PID,所以在bash中可以用echo $$来测试是不是创建了新的子进程。
2、子shell
在bash脚本中,在运行命令的alias,(),和&的时候会复制当前的shell环境并新建一个子shell环境。子shell环境有自己独立的工作目录(pwd),继承原先shell环境中的alias和function。
创建子shell时新建子进程但子进程由bash维护,只能通过$BASHPID获取PID,与父进程共用同一个POSIX语义下的PID与PPID。本质上实现了多进程。
3、子shell和父shell
在bash中打开另一个bash,重新打开的那个bash并不属于子shell,它只是因为执行了外部命令而运行了一个新的bash,这个bash也有自己的运行环境,但一个真正的子shell是不需要重新用外部命令启动的,并且子shell可以访问父shell中定义的变量。
三、SHLVL和BASH_SUBSHELL
SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器,而 BASH_SUBSHELL 是记录一个 Bash 进程实例中多个子 Shell(subshell)嵌套深度的累加器。
#!/bin/bash func() { echo $BASH_SUBSHELL } ( ( (func) ) ) //3 ( ( (func &) ) ) //4 sleep 1 echo $SHLVL //3 bash -c `echo $SHLVL` //4
浙公网安备 33010602011771号