in reply to Re^2: how to get rid of pressing control+c keys
in thread how to get rid of pressing control+c keys
So, your problem was
Since OUT is connected to a pipe, you can never leave the loop until it closes, and it never closes with a bash shell (but it will with a simple command).#getresult while(<OUT>){......}
So, you need to get rid out the while(<OUT>) syntax, and switch to sysread. Something like this:
The above sucks 2k from the pipe, until there is 0 there. Be warned however, that this is not a general purpose solution to the problem. Each command can act differently, and there are a whole bunch of uncooperative commands that require a terminal to output to. These commands need a pseudo-tty ( see IO::Pty ) and can be very hard to deal with.if( sysread( OUT, my $buffer, 2048 ) > 0 ){ print $buffer }
But for most commands, a combination of IO::Select and sysread will work. Here is a small example I wrote for Tk. Here, fileevent is Tk's version of IO::Select
#!/usr/bin/perl use warnings; use strict; use Tk; use IPC::Open3; require Tk::ROText; $|=1; my $mw = new MainWindow; my $entry=$mw->Entry(-width => 80)->pack; $mw->Button(-text => 'Execute', -command => \&send_to_shell)->pack; my $textwin =$mw->Scrolled('ROText', -width => 80, -bg =>'white', -height => 24, )->pack; $textwin->tagConfigure( 'err', -foreground => 'red' ); my $pid = open3( \*IN, \*OUT, \*ERR, '/bin/bash' ) or warn "$!\n"; $mw->fileevent( \*OUT, readable => \&read_stdout ); $mw->fileevent( \*ERR, readable => \&read_stderr ); MainLoop; sub read_stdout { if( sysread( OUT, my $buffer, 1024 ) > 0 ){ $textwin->insert( 'end', $buffer ); $textwin->see('end'); } } sub read_stderr { if( sysread(ERR, my $buffer, 1024 ) > 0 ){ $textwin->insert( 'end', $buffer, 'err' ); $textwin->see('end'); } } sub send_to_shell { my $cmd= $entry->get(); print IN "$cmd\n"; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: how to get rid of pressing control+c keys
by harsha.reddy (Acolyte) on Oct 09, 2007 at 14:24 UTC |