App-MHFS
view release on metacpan or search on metacpan
lib/MHFS/Process.pm view on Meta::CPAN
package MHFS::Process v0.7.0;
use 5.014;
use strict; use warnings;
use feature 'say';
use Symbol 'gensym';
use Time::HiRes qw( usleep clock_gettime CLOCK_REALTIME CLOCK_MONOTONIC);
use POSIX ":sys_wait_h";
use IO::Socket::INET;
use IO::Poll qw(POLLIN POLLOUT POLLHUP);
use Errno qw(EINTR EIO :POSIX);
use Fcntl qw(:seek :mode);
use File::stat;
use IPC::Open3;
use Scalar::Util qw(looks_like_number weaken);
use Data::Dumper;
use Devel::Peek;
use MHFS::FD::Reader;
use MHFS::FD::Writer;
use MHFS::EventLoop::Poll;
use Carp;
#my %CHILDREN;
#$SIG{CHLD} = sub {
# while((my $child = waitpid(-1, WNOHANG)) > 0) {
# my ($wstatus, $exitcode) = ($?, $?>> 8);
# if(defined $CHILDREN{$child}) {
# say "PID $child reaped (func) $exitcode";
# $CHILDREN{$child}->($exitcode);
# # remove file handles here?
# $CHILDREN{$child} = undef;
# }
# else {
# say "PID $child reaped (No func) $exitcode";
# }
# }
#};
sub _setup_handlers {
my ($self, $in, $out, $err, $fddispatch, $handlesettings) = @_;
my $pid = $self->{'pid'};
my $evp = $self->{'evp'};
if($fddispatch->{'SIGCHLD'}) {
say "PID $pid custom SIGCHLD handler";
#$CHILDREN{$pid} = $fddispatch->{'SIGCHLD'};
$evp->register_child($pid, $fddispatch->{'SIGCHLD'});
}
if($fddispatch->{'STDIN'}) {
$self->{'fd'}{'stdin'} = MHFS::FD::Writer->new($self, $in, $fddispatch->{'STDIN'});
$evp->set($in, $self->{'fd'}{'stdin'}, POLLOUT | MHFS::EventLoop::Poll->ALWAYSMASK);
}
else {
$self->{'fd'}{'stdin'}{'fd'} = $in;
}
if($fddispatch->{'STDOUT'}) {
$self->{'fd'}{'stdout'} = MHFS::FD::Reader->new($self, $out, $fddispatch->{'STDOUT'});
$evp->set($out, $self->{'fd'}{'stdout'}, POLLIN | MHFS::EventLoop::Poll->ALWAYSMASK());
}
else {
$self->{'fd'}{'stdout'}{'fd'} = $out;
}
if($fddispatch->{'STDERR'}) {
$self->{'fd'}{'stderr'} = MHFS::FD::Reader->new($self, $err, $fddispatch->{'STDERR'});
$evp->set($err, $self->{'fd'}{'stderr'}, POLLIN | MHFS::EventLoop::Poll->ALWAYSMASK);
}
else {
$self->{'fd'}{'stderr'}{'fd'} = $err;
}
if($handlesettings->{'O_NONBLOCK'}) {
# stderr
{
my $flags = fcntl($err, Fcntl::F_GETFL, 0) or die "$!";
fcntl($err, Fcntl::F_SETFL, $flags | Fcntl::O_NONBLOCK) or die "$!";
( run in 0.699 second using v1.01-cache-2.11-cpan-39bf76dae61 )