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
| int daemon (int nochdir, int noclose)
{
int fd;
/* 步骤 1: fork 出一个新的子进程,用以开启新的会话 */
switch (__fork()) {
case -1:
return (-1);
case 0:
break;
default:
_exit(0);
}
/* 步骤 2: 开启一个新的会话 */
if (__setsid() == -1)
return (-1);
if (!nochdir)
/* 步骤 3: 把进程当前的执行路径换到根目录 */
(void)__chdir("/");
if (!noclose) {
/* 步骤 4: 将当前进程的标准输入、输出和错误都重定向到/dev/null */
struct stat64 st;
if ((fd = open_not_cancel(_PATH_DEVNULL, O_RDWR, 0)) != -1
&& (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0)
== 0)) {
/* …… */
(void)__dup2(fd, STDIN_FILENO);
(void)__dup2(fd, STDOUT_FILENO);
(void)__dup2(fd, STDERR_FILENO);
/* …… */
}
}
return (0);
}
|