Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > How to recognize which child process has just ended?

Reply
Thread Tools

How to recognize which child process has just ended?

 
 
Lukasz Muziol
Guest
Posts: n/a
 
      08-07-2006
Hi!

The piece of software I'm working on now needs to fork child processes
and execute different programs (which terminate themselves). Also, some
child processes need to be killed/stopped/resumed and action needs to be
taken when a child is terminated. When the parent receives & traps the
SIGCLD signal, how does it know which child it is regarding and whether
it has been ended, terminated, stopped or resumed?

In brief, I need the information, which in C signal handling is
accessible via the siginfo_t structure.

Thanks.

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Francis Cianfrocca
Guest
Posts: n/a
 
      08-07-2006
Lukasz Muziol wrote:
> Hi!
>
> The piece of software I'm working on now needs to fork child processes
> and execute different programs (which terminate themselves). Also, some
> child processes need to be killed/stopped/resumed and action needs to be
> taken when a child is terminated. When the parent receives & traps the
> SIGCLD signal, how does it know which child it is regarding and whether
> it has been ended, terminated, stopped or resumed?
>
> In brief, I need the information, which in C signal handling is
> accessible via the siginfo_t structure.
>
> Thanks.


Look at Process#wait2 and Process#waitpid2.

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
ara.t.howard@noaa.gov
Guest
Posts: n/a
 
      08-07-2006
On Tue, 8 Aug 2006, Francis Cianfrocca wrote:

> Lukasz Muziol wrote:
>> Hi!
>>
>> The piece of software I'm working on now needs to fork child processes
>> and execute different programs (which terminate themselves). Also, some
>> child processes need to be killed/stopped/resumed and action needs to be
>> taken when a child is terminated. When the parent receives & traps the
>> SIGCLD signal, how does it know which child it is regarding and whether
>> it has been ended, terminated, stopped or resumed?
>>
>> In brief, I need the information, which in C signal handling is
>> accessible via the siginfo_t structure.
>>
>> Thanks.

>
> Look at Process#wait2 and Process#waitpid2.


i don't think that's sufficient - one would still need a sig handler,
something along the lines of:


harp:~ > cat a.rb
require 'thread'

q = Queue.new

trap('SIGCHLD'){ q.push :go }

reaper = Thread.new do
Thread.abort_on_exception = true

loop do
q.pop
pid, status = Process.wait2
p [pid, status]
end
end


fork{ exit 42 }
sleep 1

fork{ exit 2 }

puts '...'
sleep


harp:~ > ruby a.rb
[26939, #<Process::Status: pid=26939,exited(42)>]
[26940, #<Process::Status: pid=26940,exited(2)>]
...


regards.

-a
--
to foster inner awareness, introspection, and reasoning is more efficient than
meditation and prayer.
- h.h. the 14th dali lama

 
Reply With Quote
 
Francis Cianfrocca
Guest
Posts: n/a
 
      08-07-2006
unknown wrote:

> i don't think that's sufficient - one would still need a sig handler,
> something along the lines of:
>


That's a surprise, what made you think so? Is that true on Windows,
perhaps? On Unix no sig handler is needed. SIGCHLD is ignored by
default. The following works:

#----------------------

fork {exit 42}
fork {exit 2}

Process.wait2
Process.wait2

#----------------------

You can also call #wait and its variants with the flag Process::WNOHANG
if you want to poll. Use a SIGCHLD handler if you need to know instantly
when a child process finishes, but as always observe the standard
guidelines for coding signal handlers.

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
ara.t.howard@noaa.gov
Guest
Posts: n/a
 
      08-07-2006
On Tue, 8 Aug 2006, Francis Cianfrocca wrote:

> Use a SIGCHLD handler if you need to know instantly
> when a child process finishes, but as always observe the standard
> guidelines for coding signal handlers.


sorry i wasn't more explicit - it's this that i interpreted the OP had wanted
since he asked to know __when__ the child exited not to do something whenever
it happened to. i may have been mistaken in my interpretation though...

in any case we are in total agreement.

-a
--
to foster inner awareness, introspection, and reasoning is more efficient than
meditation and prayer.
- h.h. the 14th dali lama

 
Reply With Quote
 
Lukasz Muziol
Guest
Posts: n/a
 
      08-10-2006
Thank you both.

As a matter of fact I do need to use a signal handler (the application
has an ncurses interface, so most of the time it's locked on getch calls
and action needs to be taken on child death), but the answer to my
problem is indeed the Process#wait2 method, which I somehow managed to
overlook.

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
pexpect on windows - child process of another child process - quickquestion Z W Python 0 03-09-2013 10:00 PM
a simple program to illustrate that child process does not shareresources with parent process sree.harsha.sn@gmail.com C Programming 4 11-09-2008 03:59 AM
Child process wait father process excute some code then begin execute empriser C Programming 1 03-06-2007 02:24 AM
How do I: Main thread spawn child threads, which child processes...control those child processes? Jeff Rodriguez C Programming 23 12-09-2003 11:06 PM



Advertisments