Linux的system()和popen()差异(源码)

Linux的system()和popen()差异
https://blog.csdn.net/liuxingen/article/details/47057539?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

1.1 Linux中内建命令与非内建命令简单认识

在Linux中,我们通过shell命令与内核进行对话。GNU bash shell为我们经常用的shell。Centos Ubuntu6.10以后版本 RHLE等常用linux发行版默认shell基本都为bash shell。在bash shell中区分内建命令和非内建命令(又称外部命令)。

非内建命令(外部命令)

非内建命令时存在于bash shell之外的程序,他们并不是shell中的是一部分,如果想了解非内建命令具体有哪些,可查看/bin,/usr/bin,/sbin,/user/sbin。如果你想查看你使用的命令是否为外部命令,可使用which命令或type命令进行查看。常见的ps命令就是一个非内建命令
在这里插入图片描述
type命令很清晰的告诉你ps命令的类型并且告诉你所在目录。当非内建命令被执行时,会创建出一个子进程。这种操作被称为衍生。ps命令可以很方便的显示它的父进程以及自己所对应的衍生进程

在这里插入图片描述

从PID和PPID可以清楚的看出进程间的关系。当进程进行衍生操作时。会设置新的子进程运行环境,消耗更多的资源。

内建命令
内建命令是bash shell中的一部分工具,不需要外部程序就可执行,当然也不用创建子进程。效率更高,执行速度更快。cd命令就是一个内建命令
在这里插入图片描述
使用type查看可以清楚的告诉你它是shell内建的。
需要注意的是,有的命令可以多种实现,要查看命令的不同实现可以使用type命令的-a参数。pwd就是既有内建也有非内建,如要使用外部命令,直接指明对应文件即可

在这里插入图片描述
**

1.2详解shell中source、sh、bash、./执行脚本的区别

**

1、source命令用法:

source FileName
  作用:在当前bash环境下读取并执行FileName中的命令。该filename文件可以无"执行权限"
注:该命令通常用命令“.”来替代。
如:source .bash_profile
. .bash_profile两者等效。
source(或点)命令通常用于重新执行刚修改的初始化文档。
source命令(从 C Shell 而来)是bash shell的内置命令。
点命令,就是个点符号,(从Bourne Shell而来)。

2、sh和bash命令用法:
sh FileName
bash FileName
作用:在当前bash环境下读取并执行FileName中的命令。该filename文件可以无"执行权限"
注:两者在执行文件时的不同,是分别用自己的shell来跑文件。
sh使用“-n”选项进行shell脚本的语法检查,使用“-x”选项实现shell脚本逐条语句的跟踪,
可以巧妙地利用shell的内置变量增强“-x”选项的输出信息等。

3、./的命令用法:
./FileName
作用:打开一个子shell来读取并执行FileName中命令。
注:运行一个shell脚本时会启动另一个命令解释器.
每个shell脚本有效地运行在父shell(parent shell)的一个子进程里.
这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程.
shell脚本也可以启动他自已的子进程.
这些子shell(即子进程)使脚本并行地,有效率地地同时运行脚本内的多个子任务.

shell的嵌入命令:
空,永远返回为true
. 从当前shell中执行操作
break 退出for、while、until或case语句
cd 改变到当前目录
continue 执行循环的下一步
echo 反馈信息到标准输出
eval 读取参数,执行结果命令
exec 执行命令,但不在当前shell
exit 退出当前shell
export 导出变量,使当前shell可利用它
pwd 显示当前目录
read 从标准输入读取一行文本
readonly 使变量只读
return 退出函数并带有返回值
set 控制各种参数到标准输出的显示
shift 命令行参数向左偏移一个
test 评估条件表达式
times 显示shell运行过程的用户和系统时间
trap 当捕获信号时运行指定命令
ulimit 显示或设置shell资源
umask 显示或设置缺省文件创建模式
unset 从shell内存中删除变量或函数
wait 等待直到子进程运行完毕
下面再看下 shell 脚本各种执行方式(source ./ .sh, . ./.sh, ./ .sh)的区别
结论一: ./
.sh的执行方式等价于sh ./ .sh或者bash ./.sh,此三种执行脚本的方式都是重新启动一个子shell,在子shell中执行此脚本。
结论二: .source ./ .sh和 . ./.sh的执行方式是等价的,即两种执行方式都是在当前shell进程中执行此脚本,而不是重新启动一个shell 而在子shell进程中执行此脚本。
验证依据:没有被export导出的变量(即非环境变量)是不能被子shell继承的
验证结果:

1.遇到的问题使用popen(“. /set_envirment”, “r”),使用system(echo $PATH),当前的环境变量echo $PATH没有变化,

Source 命令不建立子shell,而system建立了子shell,system(echo $PATH)查看的不是当前PATH值而是子shell的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值