setsid: code shrink, expanded comments
[platform/upstream/busybox.git] / miscutils / setsid.c
index c573fae..637081b 100644 (file)
  * - busyboxed
  */
 
+//usage:#define setsid_trivial_usage
+//usage:       "PROG ARGS"
+//usage:#define setsid_full_usage "\n\n"
+//usage:       "Run PROG in a new session. PROG will have no controlling terminal\n"
+//usage:       "and will not be affected by keyboard signals (Ctrl-C etc).\n"
+//usage:       "See setsid(2) for details."
+
 #include "libbb.h"
 
 int setsid_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
@@ -24,7 +31,17 @@ int setsid_main(int argc UNUSED_PARAM, char **argv)
 
        /* setsid() is allowed only when we are not a process group leader.
         * Otherwise our PID serves as PGID of some existing process group
-        * and cannot be used as PGID of a new process group. */
+        * and cannot be used as PGID of a new process group.
+        *
+        * Example: setsid() below fails when run alone in interactive shell:
+        *  $ setsid PROG
+        * because shell's child (setsid) is put in a new process group.
+        * But doesn't fail if shell is not interactive
+        * (and therefore doesn't create process groups for pipes),
+        * or if setsid is not the first process in the process group:
+        *  $ true | setsid PROG
+        * or if setsid is executed in backquotes (`setsid PROG`)...
+        */
        if (setsid() < 0) {
                pid_t pid = fork_or_rexec(argv);
                if (pid != 0) {
@@ -36,7 +53,7 @@ int setsid_main(int argc UNUSED_PARAM, char **argv)
                         * However, the code is larger and upstream
                         * does not do such trick.
                         */
-                       exit(EXIT_SUCCESS);
+                       return EXIT_SUCCESS;
                }
 
                /* child */