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); } |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |