Re: forking in setsid

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 19 June 2013 15:53, Damien Wyart <damien.wyart@xxxxxxxxx> wrote:
> While searching information about setsid and daemonization, I came accros
> the following "bug" report in Debian :
> http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=495881
>
> Unfortunately, it doesn't seem to have been forwarded upstream after
> creation, and never received an answer.
>
> I would be interested in getting your opinions about it and the patch
> attached to it.

Hi Damien,

I am not sure if it is good idea to change default behavior of the
software. Perhaps waiting return value of child should be new option,
something like


>From c2deb80ef6feb7039a0554e4b8a8272e59cb1a87 Mon Sep 17 00:00:00 2001
From: Daniel Kahn Gillmor <dkg@xxxxxxxxxxxxxxxxx>
Date: Wed, 20 Aug 2008 12:00:00 +0100
Subject: [PATCH] setsid: add an option to wait child return value
Organization: Lastminute.com

This change was sent by Damien Wyart in behalf of Daniel Kahn Gillmor.

Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=495881
Reference: http://permalink.gmane.org/gmane.linux.utilities.util-linux-ng/7736
Reported-by: Damien Wyart <damien.wyart@xxxxxxxxx>
Signed-off-by: Sami Kerola <kerolasa@xxxxxx>
---
 sys-utils/setsid.1 |  5 +++++
 sys-utils/setsid.c | 28 +++++++++++++++++++++++-----
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/sys-utils/setsid.1 b/sys-utils/setsid.1
index eff7948..da8d648 100644
--- a/sys-utils/setsid.1
+++ b/sys-utils/setsid.1
@@ -15,6 +15,11 @@ runs a program in a new session.
 .TP
 \fB\-c\fP, \fB\-\-ctty\fP
 Set the controlling terminal to the current one.
+.TP
+\fB\-w\fP, \fB\-\-wait\fP
+Wait the execution of the program to end, and return the exit value of
+the child as return value of the
+.BR setsid .
 .SH "SEE ALSO"
 .BR setsid (2)
 .SH AUTHOR
diff --git a/sys-utils/setsid.c b/sys-utils/setsid.c
index 756a520..0e11a1a 100644
--- a/sys-utils/setsid.c
+++ b/sys-utils/setsid.c
@@ -9,6 +9,9 @@
  * 2001-01-18 John Fremlin <vii@xxxxxxxxxxxxxxxxxx>
  * - fork in case we are process group leader
  *
+ * 2008-08-20 Daniel Kahn Gillmor <dkg@xxxxxxxxxxxxxxxxx>
+ * - if forked, wait on child process and emit its return code.
+ *
  */

 #include <getopt.h>
@@ -16,6 +19,8 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/wait.h>

 #include "c.h"
 #include "nls.h"
@@ -29,8 +34,8 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out)
  program_invocation_short_name);

  fputs(USAGE_OPTIONS, out);
- fputs(_(" -c, --ctty     set the controlling terminal to the current one\n"),
- out);
+ fputs(_(" -c, --ctty     set the controlling terminal to the current
one\n"), out);
+ fputs(_(" -w, --wait     wait program to exit, and use the same
return\n"), out);

  fputs(USAGE_HELP, out);
  fputs(USAGE_VERSION, out);
@@ -43,10 +48,13 @@ int main(int argc, char **argv)
 {
  int ch;
  int ctty = 0;
+ pid_t pid;
+ int status = 0;

  static const struct option longopts[] = {
  {"ctty", no_argument, NULL, 'c'},
  {"version", no_argument, NULL, 'V'},
+ {"wait", no_argument, NULL, 'w'},
  {"help", no_argument, NULL, 'h'},
  {NULL, 0, NULL, 0}
  };
@@ -56,7 +64,7 @@ int main(int argc, char **argv)
  textdomain(PACKAGE);
  atexit(close_stdout);

- while ((ch = getopt_long(argc, argv, "+Vhc", longopts, NULL)) != -1)
+ while ((ch = getopt_long(argc, argv, "+Vhcw", longopts, NULL)) != -1)
  switch (ch) {
  case 'V':
  printf(UTIL_LINUX_VERSION);
@@ -64,6 +72,9 @@ int main(int argc, char **argv)
  case 'c':
  ctty=1;
  break;
+ case 'w':
+ status = 1;
+ break;
  case 'h':
  usage(stdout);
  default:
@@ -74,15 +85,22 @@ int main(int argc, char **argv)
  usage(stderr);

  if (getpgrp() == getpid()) {
- switch (fork()) {
+ pid = fork();
+ switch (pid) {
  case -1:
  err(EXIT_FAILURE, _("fork"));
  case 0:
  /* child */
  break;
  default:
+ if (!status)
+ return EXIT_SUCCESS;
  /* parent */
- return 0;
+ if (wait(&status) != pid)
+ err(EXIT_FAILURE, "wait");
+ if (WIFEXITED(status))
+ return WEXITSTATUS(status);
+ err(status, _("child %d did not exit normally"), pid);
  }
  }
  if (setsid() < 0)
--
1.8.3.1
--
To unsubscribe from this list: send the line "unsubscribe util-linux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux