Quantcast
Channel: proc_open: Extending file descriptor numbers to enable "status" feedback from a Perl script - Stack Overflow
Viewing all articles
Browse latest Browse all 3

Answer by Greg Bacon for proc_open: Extending file descriptor numbers to enable "status" feedback from a Perl script

$
0
0

Say you want to monitor the progress of a hello-world program, where each step is a dot written to the designated file descriptor.

#! /usr/bin/env perl

use warnings;
use strict;

die "Usage: $0 progress-fd\n" unless @ARGV == 1;

my $fd = shift;
open my $progress, ">&=", $fd or die "$0: dup $fd: $!";

# disable buffering on both handles
for ($progress, *STDOUT) {
  select $_;
  $| = 1;
}

my $output = "Hello, world!\n";

while ($output =~ s/^(.)(.*)\z/$2/s) {
  my $next = $1;
  print $next;
  print $progress ".";
  sleep 1;
}

Using bash syntax to open fd 3 on /tmp/progress and connect it to the program is

$ (exec 3>/tmp/progress; ./hello-world 3)
Hello, world!

$ cat /tmp/progress
..............

(It’s more amusing to watch live.)

To also see the dots on your terminal as they emerge, you could open your progress descriptor and effectively dup2 it onto the standard error—again using bash syntax and more fun in real time.

$ (exec 17>/dev/null; exec 17>&2; ./hello-world 17)
H.e.l.l.o.,. .w.o.r.l.d.!.
.

You could of course skip the extra step with

$ (exec 17>&2; ./hello-world 17)

to get the same effect.

If your Perl program dies with an error such as

$ ./hello-world 333
./hello-world: dup 333: Bad file descriptor at ./hello-world line 9.

then the write end of your pipe on the PHP side probably has its close-on-exec flag set.


Viewing all articles
Browse latest Browse all 3

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>