in reply to How to create private signals? (or block interruption)

Which version of Perl are you using? This sounds like unsafe signals to me.
System (kernal) calls are either signal safe or return EINTR, which is probably what is raising the message. See http://www.unix.com.ua/orelly/perl/cookbook/ch16_18.htm
  • Comment on Re: How to create private signals? (or block interruption)

Replies are listed 'Best First'.
Re^2: How to create private signals? (or block interruption)
by rapide (Beadle) on Sep 03, 2008 at 14:48 UTC
    I'm using perl v5.8.5
    Use the Config module to find out whether you have reliable signals:
    use Config;
    print "Hurrah!\n" if $Config{d_sigaction};

    RESULT: Hurrah!

    To determine whether your interrupted system calls will automatically restart, look at your system's C signal.h include file: % egrep 'SAV_(RESTART|INTERRUPT)' /usr/include/*/signal.h

    RESULT:
    /usr/include/asm/signal.h: * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the
    /usr/include/asm/signal.h: * SA_RESTART flag to get restarting signals (which were the default long ago)
    /usr/include/asm/signal.h:#define SA_RESTART 0x10000000
    /usr/include/asm/signal.h:#define SA_INTERRUPT 0x20000000 /* dummy -- ignored */

    Basically I do not know what to do. I've tried those examples that you gave me link to, but it still gives me the warning. However, when I used $SIG{INT} = 'IGNORE'; I managed to delay the interruption with 2 seconds.

    UPDATE: I found out that if I'm running a single process/thread it works. It seems like the reasoning from crashing comes from the fact that I fork another process in the background. Do I have to put some handlers inside this fork aswell? Or is there any signal for "children" that I can use ?

      SIGCHLD is the signal the parent gets from the kernel when the child terminates. Other than that, there are no special "children signals."

      A forked child is an exact copy of the parent, until the child starts developing own ideas. Signal handlers should be the same in the child - if they are set up before forking, that is.

      I guess at this point I need to see a bit more of the code involved to make an educated guess.