LINUX.IE, website of the Irish Linux Users' Group
Tux rules!

   
Home
New Users
Articles
Download
Projects
Community
Vendors

  Print Version
Email to...
 
Archives:


planetILUG

Recent News

News Archive


Join the
ILUG
on FaceBook


Join the
ILUG
on LinkedIn


Join the
ILUG SETI
Group



















 
 :: Mailing Lists

[ILUG] Signal handling

[ILUG] Signal handling

Justin Mason jm at jmason.org
Tue Dec 7 19:35:28 GMT 2004


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


Dale Dunlea writes:
> > > But sometimes bad things happen. Sometime programs crash. 
> > But the pid 
> > > of the child process is stored and so when the program restarts, it 
> > > knows the pid of the child process of its previous 
> > instance. I need to 
> > > install a signal handler in the new program instance for 
> > the old child 
> > > process - to reparent it essentially. I presume there is a way of 
> > > doing this, but I'm quite new to process control and all that.
> > 
> > btw the most common idiom here would be to either (a) kill 
> > the subprocess and start a new one when the new parent 
> > starts, or (b) kill the subprocess from the parent's SIGTERM 
> > signal handler before it exits.
> > 
> > I think a bit more info is needed btw.
> 
> It's an audio app and the child process is the actual audio player
> program. Killing it an restarting is a little messy. Hence the desire to
> let it play out even though the process that spawned it has died.

I think you'd be better off coming up with a way to kill/restart cleanly
so that the child isn't left running when the parent dies.

The general UNIX idiom is that if you fork a process, and the parent is
killed with SIGINT or SIGTERM, the parent kills the child in response,
before it itself cleans up and exits.   This is the general case; it
applies in most cases, apart from "nohup" or when starting a daemon.

However, if you're still keen to keep the child running after the parent
has exited -- what you can do is the following:

  - when starting the child: record its PID in a pidfile somewhere on-disk

  - when a new parent process is started: check that pidfile to see if a
    child is running

  - read the PID from that file, and use kill(0, pid) to see if the
    process with that ID exists

  - do not use SIGCHLD to track if the child is alive or dead, since that
    will not work if the child's parent != current process

  - instead use kill(0, pid) periodically to poll the child and ensure
    it's still running.  if kill returns the error ESRCH, the child has
    exited and you can deal with that (restart a new one or whatever).

- --j.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)
Comment: Exmh CVS

iD8DBQFBtgX/MJF5cimLx9ARAoyqAJwJpbHedGolujvCdv81t2lg5SXwewCgilgZ
3+C1V25r5CZ3XG2zEazJt6c=
=Y6Ie
-----END PGP SIGNATURE-----




More information about the ILUG mailing list
Read this without the formatting.
                                                                                                    

 

Hosted by HEAnet


Maintained by the ILUG website team. The aim of Linux.ie is to support and help commercial and private users of Linux in Ireland. You can display ILUG news in your own webpages, read backend information to find out how. Networking services kindly provided by HEAnet, server kindly donated by Dell. Linux is a trademark of Linus Torvalds, used with permission. No penguins were harmed in the production or maintenance of this highly praised website. Looking for the Indian Linux Users' Group? Try here. If you've read all this and aren't a lawyer: you should be!
RSS Version
Powered by Dell