Search code examples
perltimeoutqx

How can I implement a timeout for a qx(command)?


How could I implement in this piece of code a timeout: if the "hwinfo --usb"-command didn't return anything after a certain amount of time, ( stop the command and ) do a return or die from the sub _usb_device.

#!/usr/bin/env perl
use warnings; 
use strict;


sub _usb_device {
    my @array;
    {
    local $/ = "";
    @array = qx( hwinfo --usb );
    }
    ...
    ...
}

Solution

  • Timeouts are usually done with alarms.

    
     sub _usb_device 
     {
        # Scope array
        my @array;
    
        # Try shell command
        eval
        {
            local $SIG{ALRM} = sub { die "timeout\n" };
            local $/ = "";
            alarm 10;
            @array = qx( hwinfo --usb );
            alarm 0;
        };
    
        # Catch and rethrow non timout errors
        die $@ if $@ && $@ ne "timeout\n";
    
        # Done
        return @array;
     }