in reply to Redirect dos console output to a widget

You might try setting up a tied handle that would add anything sent to it to your widget, and then replacing STDOUT and STDERR with it. You'll probably have to use typeglob assignment to change STDOUT and STDERR, since I doubt the dup'ing form of open would work with tied handles... Not sure aboot that, though.

HTH

bbfu
Seasons don't fear The Reaper.
Nor do the wind, the sun, and the rain.
We can be like they are.

  • Comment on (bbfu) (tied handles) Re: Redirect dos console output to a widget

Replies are listed 'Best First'.
Re: (bbfu) (tied handles) Re: Redirect dos console output to a widget
by John M. Dlugosz (Monsignor) on Aug 23, 2001 at 10:18 UTC
    I don't think that would work. When the FD is grabbed from the handle, it will only be an OS file descriptor and won't know anything about the Perl layers. Now a pipe, being an OS construct, would do it.

    Have STDOUT and STDERR write to a pipe, and the GUI program reads from the other end and updates the widget.

    In Win32, pipes are not pseudoterminals and the program writing will know it's not the console and will buffer its output.

    —John

      one could, instead of using system, use fork/read/exec with a tied handle, which would allow perl constucts ... assuming the program to start was also perl. If the program is not perl, i agree with the pipe solution.
      can't sleep clowns will eat me
      -- MZSanford

      Um... It, uh, half works. :-)

      #!/usr/bin/perl use Tk; $mw = MainWindow->new(-name => 'Test', -title => 'Test'); $text = $mw->Text(); $text->pack(); tie *STDOUT, 'Text::Handle', $text; tie *STDERR, 'Text::Handle', $text; print "Hello\n"; print STDERR "Hi\n"; warn "Doesn't work! :(\n"; MainLoop; package Text::Handle; use Tie::Handle; @ISA = qw/Tie::StdHandle/; sub TIEHANDLE { my $class = shift; my $widget = shift; return bless \$widget, $class; } sub PRINT { my $self = shift; $$self->insert('end', join('',@_)); }

      Hrm. Looks like warn and die behave specially when it comes to STDERR. I can see good and bad points to that. :-/

      It would be nice to have it more "push" oriented so that you didn't have to poll pipes (either non-blockingly, or in a seperate thread/process) but it looks like you're still going to need warn and die %SIG handlers. But that's why I wrote Tk::Carp ;-)

      bbfu
      Seasons don't fear The Reaper.
      Nor do the wind, the sun, and the rain.
      We can be like they are.

        print "Hello\n"; print STDERR "Hi\n"; system "ls"; # what about this?
        The issue is getting an external program to "see" the redirection.

        Interesting about Warn. What exactly does it do specially with respect to STDERR?

        —John