ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

system和exec的区别

2022-06-22 16:00:44  阅读:142  来源: 互联网

标签:shell 区别 exec system echo 进程 bash


一、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

 

标签:shell,区别,exec,system,echo,进程,bash
来源: https://www.cnblogs.com/cheer-lingmu/p/16400932.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有