forked from jerrykuch/ersatz-setsid
-
Notifications
You must be signed in to change notification settings - Fork 1
/
setsid.c
71 lines (65 loc) · 1.89 KB
/
setsid.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
/**
* An ersatz setsid command for those Unixes (e.g. Mac OS X) that
* don't have one. Intended to work like (or enough like) the one
* from the util-linux-ng package that I can run the RabbitMQ test
* suite post summer 2011 on a Mac OS X dev machine.
*
* Synopsis:
* setsid program [arg...]
*
* Description:
* setsid runs a program in a new session.
*
* See Also:
* setsid(2)
*
*/
int
main(int argc, char *argv[])
{
if( argc < 2 )
{
fprintf(stderr,
"usage: %s program [arg ...]\n",
(char *)argv[0]);
}
// Are we the leader of a process group (i.e. is our process id
// equal to our process group id?)?
if (getpgrp() == getpid())
{
switch(fork())
{
case 0:
// We're in the child process...
break;
case -1:
// We're in the parent process and child creation
// failed, so squawk and exit with error code...
perror("fork");
exit(1);
default:
// We're in the parent process (setsid itself), child
// creation was OK...
exit(0);
}
}
// Create a new session and make this setsid process the session
// leader for the new session; This setsid process also becomes
// the process group leader of a new process group and has no
// controlling terminal...
if (setsid() < 0)
{
perror("setsid");
exit(1);
}
// Execute the requested command with the given arguments,
// replacing our current process image (which now has its own
// happy session and group) with a new process image...
execvp(argv[1], argv + 1);
// If we got to here, squawk and exit with an error code...
perror("execvp");
exit(1);
}