From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: Re: Re: [Xen-changelog] Detach Xend from terminal, courtesy of Horms . Date: Fri, 09 Dec 2005 15:35:27 -0600 Message-ID: <4399F89F.1090006@us.ibm.com> References: <4399ED6F.1050500@us.ibm.com> <20051209211622.GA12700@leeni.uk.xensource.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------060109080001000104080605" Return-path: In-Reply-To: <20051209211622.GA12700@leeni.uk.xensource.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Ewan Mellor Cc: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------060109080001000104080605 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Ewan Mellor wrote: >>I don't quite understand why two fork()s would be required to properly >>daemonize. I don't know of any other daemons that do that (certainly, >>xenstored and xenconsoled don't). >> >> > >It's a standard technique on Unixen. You need to fork before calling setsid >to ensure that you are not a process group leader, then afterwards to ensure >that children cannot regain the terminal. See > > I see, I've only ever needed this behavior once and did something embarrassingly more complex to achieve it :-) While not necessary for xenconsoled and xenstored, it certainly doesn't hurt. >http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16 > >(If xenstored and xenconsoled aren't doing this, then they ought to.) > > Patch is attached. >We have preserved the behaviour whereby the Xend process does not exit until it >is ready to accept connections -- it's just one fork further on (and there's >a patch with another fork on its way, for your amusement, but that's a different >story ;-) > > So that Xend can restart itself? Yeah, I saw that one :-) I'll reserve a commen there. Thanks for the explaination! Regards, Anthony Liguori >Ewan. > > > --------------060109080001000104080605 Content-Type: text/plain; name="8312_setsid_fork.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="8312_setsid_fork.diff" # HG changeset patch # User Anthony Liguori # Node ID e55633c669d11b48cf16d0ddaebbb836d7b3f5f6 # Parent 53cff3f88e45cb5230da39f86d84b6606da0cdbb Make sure to fork again after setsid() so that child cannot regain CTTY. Signed-off-by: Anthony Liguori diff -r 53cff3f88e45 -r e55633c669d1 tools/console/daemon/utils.c --- a/tools/console/daemon/utils.c Fri Dec 9 11:05:06 2005 +0000 +++ b/tools/console/daemon/utils.c Fri Dec 9 16:33:01 2005 -0500 @@ -90,6 +90,12 @@ setsid(); + if ((pid = fork()) > 0) { + exit(0); + } else if (pid == -1) { + err(errno, "fork() failed"); + } + /* redirect fd 0,1,2 to /dev/null */ if ((fd = open("/dev/null",O_RDWR)) == -1) { exit(1); diff -r 53cff3f88e45 -r e55633c669d1 tools/xenstore/xenstored_core.c --- a/tools/xenstore/xenstored_core.c Fri Dec 9 11:05:06 2005 +0000 +++ b/tools/xenstore/xenstored_core.c Fri Dec 9 16:33:01 2005 -0500 @@ -1491,6 +1491,13 @@ /* Session leader so ^C doesn't whack us. */ setsid(); + + /* Let session leader exit so child cannot regain CTTY */ + if ((pid = fork()) < 0) + barf_perror("Failed to fork daemon"); + if (pid != 0) + exit(0); + #ifndef TESTING /* Relative paths for socket names */ /* Move off any mount points we might be in. */ chdir("/"); --------------060109080001000104080605 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --------------060109080001000104080605--