SIGCHLD handler not working correctly

Discussion in 'Ruby' started by Asfand Yar Qazi, Dec 15, 2007.

  1. Hi,

    Here's some test code that demonstrates what I'm doing:

    ----------------------cut here----------------------

    #!/usr/bin/ruby -w

    trap_quit = lambda { |sig|
    signame = Signal.list.find {|k, v| v == sig }[0]
    STDERR.puts("Trapping signal #{signame}")
    }

    huphandler = inthandler = termhandler = chldhandler = nil
    huphandler = trap("HUP", &trap_quit)
    inthandler = trap("INT", &trap_quit)
    termhandler = trap("TERM", &trap_quit)

    cmd_exitstatus = nil

    chldhandler = trap("CHLD") {
    STDERR.puts("Trapping signal CHLD")
    begin
    # tmppid, status = Process.wait2(cmdpid)
    tmppid = Process.wait
    status = $?
    cmd_exitstatus = status.exitstatus
    STDERR.puts("Process::Status => " + status.inspect)
    STDERR.puts("exitstatus => " + cmd_exitstatus.inspect)
    if ! status.exited?
    raise "ARGH! The child has not exited yet!"
    end
    rescue Errno::ECHILD => e
    STDERR.puts("Command failed - probably ok? #{e.inspect}")
    # bah, ignore it, just means a command failed
    end
    }

    cmdpid = fork {
    begin
    exec("dd", "if=/dev/zero", "of=/tmp/zerofile1.asdfsdf",
    "bs=1", "count=333000000")
    rescue Errno::ENOENT => e
    STDERR.puts e.message
    exit 127
    end
    }

    while(cmd_exitstatus.nil?)
    sleep 1
    STDOUT.puts "still going..."
    STDOUT.flush
    end

    ----------------------cut here----------------------

    To see the problem, run the command, then press CTRL-C while it's
    running. It will say "ARGH! The child has not exited yet!"

    Inside the CHLD handler, exitstatus should be the valid exit status of
    the child process. However, it is nil. This is really really bad,
    because it seems to imply that the child signal, which is meant to be
    caught when a child exits, is being called while the child has NOT exited.

    Anyone tell me what I'm doing wrong?

    Thanks

    --
    To reply, take of all ZIGs !!

    Alternative email address:
    Asfand Yar Qazi, Dec 15, 2007
    #1
    1. Advertising

  2. Asfand Yar Qazi wrote the following on 15.12.2007 09:30 :
    > --
    >
    > To see the problem, run the command, then press CTRL-C while it's
    > running. It will say "ARGH! The child has not exited yet!"
    >
    > Inside the CHLD handler, exitstatus should be the valid exit status of
    > the child process.


    If I'm not mistaken, there's none because the child didn't call exit.

    > However, it is nil. This is really really bad,
    > because it seems to imply that the child signal, which is meant to be
    > caught when a child exits, is being called while the child has NOT exited.
    >


    Looking at Process::Status#exited? documentation it seems it only
    returns true if the process actually exited on its own. Here dd dies
    because of a SIGINT (calling $?.signaled? returns true).

    I'm not familiar with the signal handling details, so the following is
    no more than an educated guess.
    I believe that depending on the actual implementation of the signal
    handler you can get different reactions to a signal relative to exit
    status. Either:
    - the program aborts *in the signal handler* and don't return an exit
    status,
    - the signal handler is only used to modify internal structures and
    doesn't abort the program right away. The normal course of the program
    only checks for the exit condition so you get a delayed "normal" exit
    controlled by a signal. In this case you get an exit status.

    Lionel
    Lionel Bouton, Dec 15, 2007
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. chuckles
    Replies:
    2
    Views:
    530
    chuckles
    Aug 18, 2005
  2. Dan Stromberg

    Re: Missing SIGCHLD

    Dan Stromberg, Feb 15, 2011, in forum: Python
    Replies:
    1
    Views:
    989
    Adam Skutt
    Feb 16, 2011
  3. Moritz Karbach

    ignoring SIGCHLD

    Moritz Karbach, Jun 23, 2005, in forum: Perl Misc
    Replies:
    3
    Views:
    408
    Anno Siegel
    Jun 23, 2005
  4. msoulier
    Replies:
    1
    Views:
    133
    Ilmari Karonen
    Jul 16, 2005
  5. Replies:
    1
    Views:
    495
Loading...

Share This Page