免费注册 查看新帖 |

Chinaunix

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

一个不好理解的问题,和管道有关,望有识之士解惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-30 21:13 |只看该作者 |倒序浏览

  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use Tk;
  5. BEGIN {
  6.         if ($^O eq 'MSWin32'){
  7.                 require Win32::Console;
  8.                 Win32::Console::Free();
  9.         }
  10. }

  11. $|++;
  12. open(SP,'>stdout.txt');
  13. *STDOUT = *SP;
  14. *STDERR = *SP;
  15. open TP,"-|","netstat -an";

  16. my $mw = MainWindow->new;

  17. my $text = $mw->Text(-width => 45, -height => 35, -font => "r11")->pack;
  18. $mw->Button(-text => "Close", -command => sub { exit })->pack;
  19. $mw->repeat(1000 => \&run);

  20. MainLoop;

  21. sub run {
  22.     $mw->update;
  23.         my $line = <TP>;
  24.         if ($line){
  25.             $text->insert('end',$line);
  26.         }
  27. }
复制代码

  1. #代码1
  2. BEGIN {
  3.         if ($^O eq 'MSWin32'){
  4.                 require Win32::Console;
  5.                 Win32::Console::Free();
  6.         }
  7. }
  8. 这部分,是flw版版在perlchina提到的一个用来关闭运行窗口的方法
复制代码

  1. #代码2
  2. open(SP,'>stdout.txt');
  3. *STDOUT = *SP;
  4. *STDERR = *SP;
  5. open TP,"-|","netstat -an";
  6. 这部分,是我要打开操作的管道,由于运行窗口已经关闭了,所以把标准输出和标准错误都重定向到文件
复制代码

现在的问题是,只要我用了代码1,那么代码2里面的就不好使了,看错误文件可以发现有下面的错误信息
readline() on closed filehandle TP at r:\startit.pl line 30.
而如果不全代码1,则代码2工作正常

所以,在想,这两者之间应该有某种关系,或,应该有某种方法可以既使用代码1,也能让代码2正常工作
苦于,资料不全,用google找Win32::Console 或 管道 相关的全部是风牛马不相及的东西

所以,请各位有识之士指点一二,如果哪里写错了,请告知错误原因

论坛徽章:
0
2 [报告]
发表于 2006-11-30 22:16 |只看该作者
自己顶一下,问题尚未解决

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2006-11-30 22:24 |只看该作者
晕~
use IPC::Open2;

论坛徽章:
0
4 [报告]
发表于 2006-11-30 22:34 |只看该作者
原帖由 flw 于 2006-11-30 22:24 发表
晕~
use IPC::Open2;


总算等到一个答案了,不容易,待俺找资料试试先

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2006-11-30 23:02 |只看该作者
  1. D:\MoChou>ttt
  2. Hello, world!

  3. D:\MoChou>cat ttt.pl
  4. use strict;
  5. use warnings;

  6. use IPC::Open2;

  7. my ($in, $out);

  8. my $pid = open2( $out, $in, "perl" );
  9. print $in qq(print "Hello, world!\\n"\n);
  10. print $in "__END__\n";
  11. close $in;

  12. while( <$out> ) {
  13.     print $_;
  14. }

  15. D:\MoChou>ttt
  16. Hello, world!

  17. D:\MoChou>
复制代码

论坛徽章:
0
6 [报告]
发表于 2006-12-01 08:34 |只看该作者
原帖由 flw 于 2006-11-30 23:02 发表
[code]D:\MoChou>ttt
Hello, world!

D:\MoChou>cat ttt.pl
use strict;
use warnings;

use IPC::Open2;

my ($in, $out);

my $pid = open2( $out, $in, "perl" );
print $in qq(p ...

这个,好像跟我要达到的目标不一致
说说我的想法,有一命令行调用的程序,想用管道打开,不出现命令行窗口,把它的运行结果输出到Tk的text里面
现在碰到的问题是,不能释放双击打开后弹出的那个窗口,否则后面的管道好像就不执行了

用open2后,离我的目标更远了,第一个窗口释放后,又会弹出另一个不可控窗口,而且命令还是没执行

So..我的目标能不能实现?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2006-12-01 09:46 |只看该作者
原帖由 Namelessxp 于 2006-12-1 08:34 发表

这个,好像跟我要达到的目标不一致
说说我的想法,有一命令行调用的程序,想用管道打开,不出现命令行窗口,把它的运行结果输出到Tk的text里面
现在碰到的问题是,不能释放双击打开后弹出的那个窗口,否则后面的管道 ...

哦,那应该是你那个命令是 console win32 subsystem 的,所以它会打开窗口。
如果这样的话,可以把控制台窗口“隐藏”就好了。
我这里有个例子,是我天天都在用的,你改一下好了:
  1. use Win32::GUI;

  2. my $name = shift || die "$0 <window title pattern>\n";
  3. my $all_action = shift;

  4. $top = Win32::GUI->GetTopWindow();

  5. $handle = Win32::GUI::GetWindow( $top, GW_HWNDFIRST );
  6. do{{
  7.     $title = Win32::GUI::Text( $handle );
  8.     next if ( $title =~ /cmd\.exe - .* $name/ );
  9.     if ( $title =~ /$name/ ){
  10.         my $action;
  11.         if ( $all_action =~ /^hide|show$/ ){
  12.             $action = $all_action;
  13.         }
  14.         else{
  15.             print $title, "   <hide/show>? ";
  16.             $action = <>;
  17.             chomp $action;
  18.         }
  19.         if ( $action eq 'hide' ){
  20.             Win32::GUI::Hide( $handle );
  21.         }
  22.         elsif ( $action eq 'show' ){
  23.             Win32::GUI::Show( $handle );
  24.         }
  25.     }
  26. }}while( $handle = Win32::GUI::GetWindow( $handle, GW_HWNDNEXT ) );
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2006-12-01 09:48 |只看该作者
这是我调用它的句子:
  1. hidewin "^Debian - VMware Workstation$" hide
复制代码

论坛徽章:
0
9 [报告]
发表于 2006-12-01 20:56 |只看该作者
好使,不过,有个小问题,
当 use warnings; 的时候
会出下面这个警告,虽然不影响使用,还是想搞清楚这意味着什么
Argument "Win32::GUI" isn't numeric in subroutine entry at R:\hidewin.pl line 9.

[ 本帖最后由 Namelessxp 于 2006-12-1 21:48 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2006-12-01 23:36 |只看该作者
哦,也许是 Win32::GUI 的新版本有变化,你把
$top = Win32::GUI->GetTopWindow;
改成
$top = Win32::GUI::GetTopWindow(0);
试试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP