免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Minsic
打印 上一主题 下一主题

关于subshell和child process的问题 [复制链接]

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
11 [报告]
发表于 2009-07-23 14:28 |只看该作者

回复 #10 Minsic 的帖子

fork和exec是两个步骤

echo 是个内部命令,不用fork也不用exec,直接找到本shell进程的一部分代码去运行

/bin/echo这就是个外部命令,这时候shell就fork一下产生一个subshell(子进程),然后在subshell中exec /bin/echo,这时候childprocess中运行的就是/bin/echo的代码和数据了,自己wait 子进程的结束再进行其它代码

(/bin/echo)这是个nestsubshell的结构,首先shell fork一个subshell(子进程),由于/bin/echo是个简单命令,subshell就省去了一步fork,直接exec /bin/echo

(/bin/echo;/bin/echo)首先shell fork一个subshell(子进程一代),由于/bin/echo;/bin/echo不是个简单命令,那就不能节省了,子进程一代fork出子进程二代A,去exec第一个/bin/echo,等它结束后,再fork出子进程二代B,去exec第二条/bin/echo,而命令行的那个shell在等待fork出子进程一代的结束

exec /bin/echo,这个就在当前的shell(进程)直接读入bin/echo的代码和数据运行了,结束后进程也就结束了,通常你会发现好像shell直接退出了,其实是echo退出了,exec时shell的代码和数据已经不存在了



用穷举法能看明白不?

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
12 [报告]
发表于 2009-07-23 15:07 |只看该作者
谢谢waker苦口婆心的解答

老实讲,我也不知道自己看明白了没有  - -

我是认为我看明白了——你这里讲的和lululau在这里描述的是一样的:http://bbs.chinaunix.net/viewthr ... ;page=4#pid10717253

现在对于我主题贴的解释:因为(echo $a;echo $$)这个subshell里面的两个echo因为都是内部命令,所以这个时候只有fork没有exec;而后者用了script来运行echo $a;echo $$,因为script被认作了外部命令来处理,先是fork+exec,然后再是在这个script subshell里运行这两条echo命令,因为有exec这一步的存在,原来的变量也就不存在了,这样理解对吗?如果不对的话,那就说明你讲了那么多我还是没看明白 >_<

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
13 [报告]
发表于 2009-07-23 15:28 |只看该作者

回复 #12 Minsic 的帖子

如果要简要的总结一下的话
变量变不变,清不清这事儿,是和产不产生进程没有关系的

论坛徽章:
1
丑牛
日期:2014-08-07 17:07:05
14 [报告]
发表于 2009-07-23 15:43 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
15 [报告]
发表于 2009-07-23 16:23 |只看该作者

回复 #12 Minsic 的帖子

exec时已经取得变量的值,所以“变量不存在“与exec没有关系啊。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
16 [报告]
发表于 2009-07-23 16:41 |只看该作者
原帖由 waker 于 2009-7-23 15:28 发表
如果要简要的总结一下的话
变量变不变,清不清这事儿,是和产不产生进程没有关系的

原帖由 blackold 于 2009-7-23 16:23 发表
exec时已经取得变量的值,所以“变量不存在“与exec没有关系啊。


回了上面那帖后,溜出去想了想,觉得还是理解错了 -___-

前面黑哥说的总是fork-exec,我觉得应该指的是无论nested subshell还是script subshell都要经过这两个步骤,至于它们里面的命令,看是否单条命令还是多条命令,外部命令还是内部命令再说?于是问题还是回到我10楼——到底在fork和exec的过程中,对普通变量和环境变量做了处理没有?看两位的回答,应该是变量和fork与exec的过程没有关系?那我还是主题贴的问题:造成nested subshell和script subshell中的变量不同表现的原因是什么?

我这人比较啰嗦,脑子也不太灵光,有时候爱钻牛角尖,谢谢waker和黑哥到现在还“不离不弃”的指导,贪婪地讲,送佛送到西,那讲到我一直明白为止吧

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
17 [报告]
发表于 2009-07-23 17:04 |只看该作者

回复 #16 Minsic 的帖子

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
18 [报告]
发表于 2009-07-23 17:47 |只看该作者

回复 #16 Minsic 的帖子

a=2
echo $a
(echo $a)
你认为两条命令引用的是不是同一个变量?

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
19 [报告]
发表于 2009-07-23 17:56 |只看该作者
原帖由 blackold 于 2009-7-23 17:04 发表
关于nested subshell你可以参考http://www.sch239.spb.ru:8000/info/oreilly/unix/ksh/ch08_06.htm


慢慢看了,有问题继续……

原帖由 waker 于 2009-7-23 17:47 发表
a=2
echo $a
(echo $a)
你认为两条命令引用的是不是同一个变量?


这个我认为当然是同一个变量,其实我一开始啥fork啊、exec啊都不想的时候就是这么认为的;但是我把(echo $a)这行换成执行另外一个脚本,脚本就一行代码:echo $a,这时候打印的就是空值啊。我现在的问题就在这里,这是为什么?

论坛徽章:
1
丑牛
日期:2014-08-07 17:07:05
20 [报告]
发表于 2009-07-23 18:07 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP