Kristian Rink wrote:
> hello all,...
> 
> ...being writing a small script which is supposed to read data from
> a telephone system connected to the serial port of my linux box.
> basically, all the script does by now is to detach from the terminal
> and lurk in the background, reading from a pipe filled by cat:
> 
> 
> open(INPUT, "cat /dev/ttyS0 |")||die "cannot cat port..."; .
> .
> .
> while (<INPUT>)
> {
>   print OUTPUT $_;
>   filter_input($_,$parsetable,$keytable,$dataset);
> }
> .
> .
> .
> 
> 
> basically, it works more or less fine. I set up some signal handlers
> to catch SIGHUP and SIGTERM enabling me to reset or cleanly stop the
> process. unfortunately, while running through this loop, the script
> seems to be stuck for all eternity waiting to read input from
> <INPUT> if nothing happens, there... basically, i would like to have
> something like this 
> 
> 
> while( (<INPUT>) && (!$caughtterm) && (!$caughthup)) {
>   print OUTPUT $_;
>   filter_input($_,$parsetable,$keytable,$dataset);
> }
> 
> ($caughtterm and $caughthup are set by the handlers for SIGTERM /
> SIGHUP) to make the process interruptable / resetable even while
> waiting for input. anyhow, this does not work, for obvious reasons
> (nothing happens until any input is recieved). I was even for a
> short time thinking about polling the serial port in a loop similar
> to the one above but this probably also might end up in the script
> hanging and waiting for input until eternity ends...

The problem is that some system calls (like read(2)) are automatically
restarted after a signal is received. So your signal handler is being
called, but the read is restarted, so your program continues to wait.

You're installing your signal handler something like this, right?

   $SIG{HUP} = sub { $caughthup = 1 };

Internally, Perl is calling your system's sigaction(2) function and
passing the SA_RESTART flag, which makes slow system calls restart.

In order to get around this, you can use the POSIX::sigaction
function directly. Install the above signal handler like this:

   sub huphandler { $caughthup = 1 }
   use POSIX ':signal_h';
   sigaction SIGHUP, new POSIX::SigAction 'main::huphandler';

Since the SA_RESTART flag is left off, the read (<INPUT>) will be
interrupted by the signal (and will return undef, terminating the
loop).

> 
> can anyone give me a hint how to make this serial input
> interruptable? hints on documentation to be read for this also are
> greatly appreciated, 

Some docs are in:

   perldoc perlvar (under %SIG)
   perldoc perlipc
   perldoc POSIX

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to