免费注册 查看新帖 |

Chinaunix

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

Perl的IO可以直接重定向到Socket么? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-07-01 00:53 |只看该作者
分别查看使用select和open重定向情况下/proc/pid/fd/下文件句柄的情况,可以发现select句柄切换实际文件描述符指向没有发生改变,而open重定向可以发现1-> /path/AAA文件,exec调用本身是不会切断进程与文件句柄之间的联系的,所以open重定向是持续生效的,而select通过查看perldoc发现,其基本上只影响write、print函数以及一些输出句柄的引用,所以从实现上来讲select应该只是从底层劫持了输出句柄,当使用exec进行进程上下文切换时该变量被重置为STDOUT因而导致使用slect($cltSock)的这种方式无法达到预期效果。
这样解释是否正确?

论坛徽章:
0
12 [报告]
发表于 2009-07-01 09:03 |只看该作者
额...我也试了一下,的确和dup不像是一回事.
open(STDOUT, " >&$cltSock") 应该可以的吧

论坛徽章:
0
13 [报告]
发表于 2009-07-01 09:04 |只看该作者
你想想telnetd是怎么工作的,你要的功能就可以实现了

论坛徽章:
0
14 [报告]
发表于 2009-07-01 09:06 |只看该作者
似乎也不行,它会将&$cltSock整体作为一个文件名来处理。而使用open(STDOUT, ">&STDERR"), 是可以将STDOUT重定向到STDERR的,是否STDOUT这样的句柄与$cltSock有所不同?具体不同在什么地方?

$cltSock是一个IO::Socket的对象,所以我也尝试了open(STDOUT, ">&".fileno($cltSock))但是似乎仍然不行~~

论坛徽章:
0
15 [报告]
发表于 2009-07-01 14:18 |只看该作者
原帖由 phrack2561 于 2009-7-1 09:06 发表
似乎也不行,它会将&$cltSock整体作为一个文件名来处理。而使用open(STDOUT, ">&STDERR"), 是可以将STDOUT重定向到STDERR的,是否STDOUT这样的句柄与$cltSock有所不同?具体不同在什么地方?

$cltSock是一个IO ...



自己自言自语了写了那么多,我写的那些你就不能看看么?

所谓的STDERR    你执行命令的时候 这样写   $cmd 2>&1 即可。

论坛徽章:
0
16 [报告]
发表于 2009-07-03 10:36 |只看该作者
Sorry,这两天工作比较忙,没有来得及上来看一下,xti9er和tmp给的例子里面使用了管道,这样的话会另外启动一个进程,跟我想用exec的思路有些出入,不过能够解决问题,另外tmp兄给出的链接中的例子确实是对症下药,彻底的解决了重定向的问题,所以分给到tmp  本来想分一些给xti9er但是好像只能选定一个最佳答案,对不住xti9er了,后面有机会在给吧

论坛徽章:
0
17 [报告]
发表于 2009-07-06 18:13 |只看该作者
you are welcome!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP