免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4371 | 回复: 21
打印 上一主题 下一主题

[学习共享] 关于fork炸弹引出的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-16 20:15 |只看该作者 |倒序浏览
本帖最后由 默然回首时 于 2013-04-16 20:17 编辑

大家好,我今天在看这个fork炸弹的时候,理解的不知道对不对,大家有兴趣的指点下啊,多谢多谢

:(){ :  |   :  &};:

:   | : & 这部分的执行,我是这样理解的:

首先做了一个测试:
[root@client ~]# echo "a b c" | akw '{print "$2"}'
-bash: akw: command not found
-bash: echo: write error: Broken pipe

用这个测试下,到底是哪一部分先执行,由上面这个测试得出,是管道后面的先执行
所以,这个  : | : &  按照我的理解,是先执行 :& 的,但是又因为:是调用本身,所以这个命令会调用自己,然后放到后台,再调用自己。直到资源消耗干净,让系统失去响应。

不知道这个理解到底对不对。

再有,[root@client ~]# echo "a b c" | akw '{print "$2"}'
-bash: akw: command not found
-bash: echo: write error: Broken pipe

这个测试就把我的认知给颠覆了,到底是管道前面的执行,还是后面的执行?如果是后面的先执行,下面这个是怎么成功的:

[root@client ~]# echo "a b c" | awk '{print $2}'
b

如果先执行后面的,应该打印不出来b吧。如果说不是先执行后面的,下面这个有怎么理解呢:
[root@client ~]# ecoh "a b c" | awk '{print "abc"}'
-bash: ecoh: command not found
因为echo命令不对,所以直接就终止了,而不是先输出abc

希望大家帮忙指点下

论坛徽章:
0
2 [报告]
发表于 2013-04-16 20:45 |只看该作者
为啥一个回复的都木有呢

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
3 [报告]
发表于 2013-04-16 21:36 |只看该作者
回复 1# 默然回首时


    记得操作系统上讲的管道是进程之间通信的一种方式,当然是前者先执行了。

论坛徽章:
0
4 [报告]
发表于 2013-04-17 05:39 |只看该作者
本帖最后由 hironics 于 2013-04-17 05:41 编辑

shell 解析是从左边到右边,和是否使用了pipe木有关系


给你一个例子,更容易理解。
  1. hiro@v-pc:~$ sleep 200 | sleep 300
复制代码

  1. hiro@v-pc:/proc$ ps f
  2. 2465 pts/0    Ss     0:00 bash
  3. 2582 pts/0    S+     0:00  \_ sleep 200
  4. 2583 pts/0    S+     0:00  \_ sleep 300

  5. hiro@v-pc:/proc$ ls -l 2582/fd/ 2583/fd/
  6. 2582/fd/:
  7. total 0
  8. lrwx------ 1 hiro hiro 64  4月 16 22:21 0 -> /dev/pts/0
  9. l-wx------ 1 hiro hiro 64  4月 16 22:21 1 -> pipe:[13851]
  10. lrwx------ 1 hiro hiro 64  4月 16 22:21 2 -> /dev/pts/0

  11. 2583/fd/:
  12. total 0
  13. lr-x------ 1 hiro hiro 64  4月 16 22:21 0 -> pipe:[13851]
  14. lrwx------ 1 hiro hiro 64  4月 16 22:21 1 -> /dev/pts/0
  15. lrwx------ 1 hiro hiro 64  4月 16 22:21 2 -> /dev/pts/0

复制代码
简单的来说,你的shell 作为父进程2465 , 生成了pipe,并fork了两个子进程2582 和2583。并分别改变两个子进程的stdout 和stdin

楼主对细节如果感兴趣,可以看unix高级编程。

论坛徽章:
0
5 [报告]
发表于 2013-04-17 10:40 |只看该作者
回复 4# hironics


好的好的。我这系统实在是太差劲了。非常感谢你的回复。我先测测看啊。


   

论坛徽章:
0
6 [报告]
发表于 2013-04-17 10:41 |只看该作者
回复 3# expert1

[root@client ~]# ecoh "zzz" | akw '{print $0}'
-bash: akw: command not found
-bash: ecoh: command not found

但是我不理解为什么这里报错的时候,是先后面的报错,却不是前面的先报错

   

论坛徽章:
0
7 [报告]
发表于 2013-04-17 11:21 |只看该作者
[root@client ~]# ecok "aaa"| akw '{print $0}'
-bash: akw: command not found
-bash: ecok: command not found
[root@client ~]# akw '{print $0}' | ecok "aaa"
-bash: ecok: command not found
-bash: akw: command not found
[root@client ~]# akw '{print $0}' | ecok "aaa" | aww '{print $1}'
-bash: ecok: command not found
-bash: aww: command not found
-bash: akw: command not found
[root@client ~]# akw '{print $0}' | ecok "aaa" | aww '{print $1}' | ass "a"
-bash: ecok: command not found
-bash: aww: command not found
-bash: ass: command not found
-bash: akw: command not found

还有就是这样,管道传递的应该是标准的输出,标注错误并没有经过管道。所以,如果是从左往右执行的话,报错顺序应该是1 2 3 4这样,但是实际报错却是 2 3 4 1,不理解为什么第一个总是在最后报错。请指点

论坛徽章:
0
8 [报告]
发表于 2013-04-17 11:40 |只看该作者
我这问的有点乱了,执行顺序应该是从左到右的。
我先查查bash报错的机制。
多谢大家

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
9 [报告]
发表于 2013-04-17 12:06 |只看该作者
  1. :~/test$ a;b;c;d
  2. a:未找到命令
  3. b:未找到命令
  4. c:未找到命令
  5. d:未找到命令

  6. ~/test$ a | b | c | d
  7. c:未找到命令
  8. d:未找到命令
  9. a:未找到命令
  10. b:未找到命令

复制代码
似乎是这样的:
a;b;c;d #四条语句,a结束输出执行a的错误结果,b结束执行b的错误结果...

a | b | c | d #整个是一条语句,有四处错误。整个语句结束后四次错误同时输出,就看谁先到达你的屏幕了。


论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
10 [报告]
发表于 2013-04-17 12:53 |只看该作者
strace会看的比较清楚点吧。试下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP