当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 19 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : [笑话]今天我在公司的电脑上实验了代码:(){ :|: ; }; :
帖子发表于 : 2008-08-25 15:04 
头像

注册: 2007-08-05 17:40
帖子: 4968
送出感谢: 0 次
接收感谢: 4
结果是显然的。
---
可能是我笔误还是别的,我虽然看出来了这段代码的结构,不知怎么的:不能作为一个单词。于是就运行了这段代码。然后ssh端就不相应了,我旁边的人也不相应了!不过还好我ctrl-c速度快,没有造成太多影响!服务器连重启都没有!

--------
分析这段代码的结构:

这段代码看起来很复杂,其实就是函数定义,递归调用。这里只是使用了一个奇怪的名字作为函数名“:”,但不一定所用的bash都能支持这个字符作为函数名,我记得":"代表一个空语句,相当于python里的pass。

把:替换为a就非常清楚了a(){ a|a ; }; a

--
递归调用使用了管道,其实只是 fork了一个新的进程。但根据程序流程,根本不会运行管道对面的东西。ctrl-c(or kill)之后也是不会运行的(broken pipe)。如果换成 || ,即使非正常退出也会重新生成进程。
---
: () { : || : ; }; :
如果能运行的话会更狠!(未经测试)(拒绝各位测试)[/code]


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-08-25 15:07 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
管道的版本显然比 || 的更狠

其实这个代码威力就在于管道,管道使得两边的命令同时进行,fork 出的进程成几何级数增加 ( 1 -> 2 ->4 ->8 ..)

而 || 的话,只是简单的递归罢了


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-08-25 15:31 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
那代码,论坛里有个分析的帖子的.


_________________
关注我的blog: ε==3


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-08-25 16:01 
头像

注册: 2008-04-02 15:36
帖子: 724
地址: O_O
送出感谢: 0 次
接收感谢: 0 次
我在自己机子上运行的,死机了,强行关机后不能启动进入X,搞死我了。


_________________
^o^ && O_O && ^_^
One World|One Dream|One Piece
愛 ^_^ 這個 美麗的世界O_O

本公司专治各种不服、不爽、谩骂、挑衅。


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-08-25 16:22 
头像

注册: 2007-10-18 19:57
帖子: 190
送出感谢: 0 次
接收感谢: 0 次
sinyadvan 写道:
我在自己机子上运行的,死机了,强行关机后不能启动进入X,搞死我了。

:em04


_________________
ACER TM3220 | XP Pro & Ubuntu Hardy --------
Intel M 740 1.73 Ghz | 14.1" WXGA TFT LCD 1280x800
ATI Mobility Radeon X700 PCI EX/64MB VRAM
80 GB HDD & 802.11 b/g wireless LAN


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2008-08-25 16:28 
头像

注册: 2007-08-05 17:40
帖子: 4968
送出感谢: 0 次
接收感谢: 4
BigSnake.NET 写道:
管道的版本显然比 || 的更狠

其实这个代码威力就在于管道,管道使得两边的命令同时进行,fork 出的进程成几何级数增加 ( 1 -> 2 ->4 ->8 ..)

而 || 的话,只是简单的递归罢了


管道前面的东西没有执行完,管道对面的东西不会执行吧?

------
奇怪了,和我想的不一样!
管道前面的东西没有执行完,管道对面的东西还是会执行@!
---
明白了,只要管道建立了,对面的就会运行,如果对面的程序收到EOF就会broken pipe!(并且终止程序)
在这个代码中永远没有EOF管道,对面的程序一直运行。果然狠!


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2008-08-25 17:20 
头像

注册: 2008-04-02 15:36
帖子: 724
地址: O_O
送出感谢: 0 次
接收感谢: 0 次
cnkilior 写道:
BigSnake.NET 写道:
管道的版本显然比 || 的更狠

其实这个代码威力就在于管道,管道使得两边的命令同时进行,fork 出的进程成几何级数增加 ( 1 -> 2 ->4 ->8 ..)

而 || 的话,只是简单的递归罢了


管道前面的东西没有执行完,管道对面的东西不会执行吧?

------
奇怪了,和我想的不一样!
管道前面的东西没有执行完,管道对面的东西还是会执行@!
---
明白了,只要管道建立了,对面的就会运行,如果对面的程序收到EOF就会broken pipe!(并且终止程序)
在这个代码中永远没有EOF管道,对面的程序一直运行。果然狠!


管道前后的命令是同时执行的。若有多个管道,只有第一个管道前后的命令同时执行。


_________________
^o^ && O_O && ^_^
One World|One Dream|One Piece
愛 ^_^ 這個 美麗的世界O_O

本公司专治各种不服、不爽、谩骂、挑衅。


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2008-08-25 17:32 
头像

注册: 2007-08-05 17:40
帖子: 4968
送出感谢: 0 次
接收感谢: 4
楼上正解!
代码:
(( sleep 10 ; echo 0 ) |grep 0 ) &

代码:
ps
  PID TTY          TIME CMD
 5874 pts/4    00:00:00 bash
10679 pts/4    00:00:00 bash
10681 pts/4    00:00:00 sleep
10682 pts/4    00:00:00 grep
10683 pts/4    00:00:00 ps


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2008-08-26 9:15 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
sinyadvan 写道:
管道前后的命令是同时执行的。若有多个管道,只有第一个管道前后的命令同时执行。


有没有办法让第二个管道后的程序也同事执行呢?


_________________
关注我的blog: ε==3


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2008-08-26 10:02 
头像

注册: 2007-08-05 17:40
帖子: 4968
送出感谢: 0 次
接收感谢: 4
代码:
( sleep 10 ; echo 0 ) |grep 0  | echo 1&
1
[1] 23287

代码:
[1]+  Done                    ( sleep 10; echo 0 ) | grep 0 | echo 1

代码:
  ( sleep 10 ; echo 0 ) |grep 0 | grep 1&
[1] 20882

代码:
   PID TTY          TIME CMD
 1495 pts/24   00:00:00 bash
20880 pts/24   00:00:00 bash
20881 pts/24   00:00:00 grep
20882 pts/24   00:00:00 grep
20883 pts/24   00:00:00 sleep
20914 pts/24   00:00:00 ps

我还是认为:只要前一个程序的stdout建立了,后一个程序就会运行,当然是有一定先后顺序的!(例2)
但要是后一个程序不要stdin就“提前”运行了


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2008-08-26 13:50 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
bones7456 写道:
sinyadvan 写道:
管道前后的命令是同时执行的。若有多个管道,只有第一个管道前后的命令同时执行。


有没有办法让第二个管道后的程序也同事执行呢?


整条线上的东西同时执行的。。


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2008-08-26 14:17 
头像

注册: 2006-02-10 16:36
帖子: 2656
系统: Xubuntu14.04/Deepin
送出感谢: 13
接收感谢: 25
sinyadvan 写道:
我在自己机子上运行的,死机了,强行关机后不能启动进入X,搞死我了。

这么厉害,重启了还在作怪???不解中……


_________________
友帮拓,真难听。有没有接触官方的老大?给改了吧!
一直想找一个在linux下的Visual FoxPro/access桌面数据库。MUIBase还算是最相近的。


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2008-08-26 15:26 
头像

注册: 2007-08-05 17:40
帖子: 4968
送出感谢: 0 次
接收感谢: 4
BigSnake.NET
你是正確的。

-----
我不管怎么重定向io,后一個程序只要不依賴stdin(或不需要輸入)都正常啟動!
--

但由于操作順序,所以PID有先后!

--
所以他們之間的啟動可以說是同時的,只是操作順序而已!


页首
 用户资料  
 
14 楼 
 文章标题 :
帖子发表于 : 2008-08-26 15:29 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
这问题,和 http://forum.ubuntu.org.cn/viewtopic.ph ... highlight= 这个帖子的问题,有关系的.


_________________
关注我的blog: ε==3


页首
 用户资料  
 
15 楼 
 文章标题 :
帖子发表于 : 2008-08-26 19:22 
头像

注册: 2008-04-02 15:36
帖子: 724
地址: O_O
送出感谢: 0 次
接收感谢: 0 次
我的理解是错的,BigSnake.NET是对的。

这是我认真看完书后新的理解:
1.bash遇到管道符时先调用pipe()创建管道再调用fork()发起两个subshell执行“|”两边的命令。

2.管道两边的命令是并行的,但是管道的通信是半双工、顺序的。

3.通过内核缓冲区按先进先出的方式传输数据,管道一端顺序地写入数据,另一端顺序地读入数据。数据只读一次,之后被释放。

4.可以通过重定向符(>、<、>>、<<)改变通信路径。


_________________
^o^ && O_O && ^_^
One World|One Dream|One Piece
愛 ^_^ 這個 美麗的世界O_O

本公司专治各种不服、不爽、谩骂、挑衅。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 19 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译