setsid: code shrink, expanded comments
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 7 Aug 2013 16:49:51 +0000 (18:49 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 7 Aug 2013 16:49:51 +0000 (18:49 +0200)
function                                             old     new   delta
setsid_main                                           56      53      -3

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
miscutils/setsid.c

index ad2c8a4..637081b 100644 (file)
@@ -31,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) {
@@ -43,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 */