.B setsid
runs a program in a new session. The command calls
.BR fork (2)
-if already a process group leader. Otherwise, it executes a program in the
-current process.
+if already a process group leader. Otherwise, it executes a program in the
+current process. This default behavior is possible to override by
+the \fB\-\-fork\fR option.
.SH OPTIONS
.TP
.BR \-c , " \-\-ctty"
Set the controlling terminal to the current one.
.TP
+.BR \-f , " \-\-fork"
+Always create a new process.
+.TP
.BR \-w , " \-\-wait"
Wait for the execution of the program to end, and return the exit value of
this program as the return value of
fputs(USAGE_OPTIONS, out);
fputs(_(" -c, --ctty set the controlling terminal to the current one\n"), out);
+ fputs(_(" -f, --fork always fork\n"), out);
fputs(_(" -w, --wait wait program to exit, and use the same return\n"), out);
printf(USAGE_HELP_OPTIONS(16));
int main(int argc, char **argv)
{
- int ch;
+ int ch, forcefork = 0;
int ctty = 0;
pid_t pid;
int status = 0;
static const struct option longopts[] = {
{"ctty", no_argument, NULL, 'c'},
+ {"fork", no_argument, NULL, 'f'},
{"wait", no_argument, NULL, 'w'},
{"version", no_argument, NULL, 'V'},
{"help", no_argument, NULL, 'h'},
textdomain(PACKAGE);
atexit(close_stdout);
- while ((ch = getopt_long(argc, argv, "+Vhcw", longopts, NULL)) != -1)
+ while ((ch = getopt_long(argc, argv, "+Vhcfw", longopts, NULL)) != -1)
switch (ch) {
case 'V':
printf(UTIL_LINUX_VERSION);
case 'c':
ctty=1;
break;
+ case 'f':
+ forcefork = 1;
+ break;
case 'w':
status = 1;
break;
errtryhelp(EXIT_FAILURE);
}
- if (getpgrp() == getpid()) {
+ if (forcefork || getpgrp() == getpid()) {
pid = fork();
switch (pid) {
case -1: