⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 daemonize.c

📁 unix环境高级编程第二版配套源代码 unix环境高级编程第二版配套源代码
💻 C
字号:
#include "apue.h"#include <syslog.h>#include <fcntl.h>#ifdef BSD#include <sys/time.h>#endif#include <sys/resource.h>voiddaemonize(const char *cmd){	int i, fd0, fd1, fd2;	pid_t pid;	struct rlimit rl;	struct sigaction sa;	/*	 * Clear file creation mask.	 */	umask(0);	/*	 * Get maximum number of file descriptors.	 */	if (getrlimit(RLIMIT_NOFILE, &rl) < 0)		err_quit("%s: can't get file limit", cmd);	/*	 * Become a session leader to lose controlling TTY.	 */	if ((pid = fork()) < 0)		err_quit("%s: can't fork", cmd);	else if (pid != 0) /* parent */		exit(0);	setsid();	/*	 * Ensure future opens won't allocate controlling TTYs.	 */	sa.sa_handler = SIG_IGN;	sigemptyset(&sa.sa_mask);	sa.sa_flags = 0;	if (sigaction(SIGHUP, &sa, NULL) < 0)		err_quit("%s: can't ignore SIGHUP");	if ((pid = fork()) < 0)		err_quit("%s: can't fork", cmd);	else if (pid != 0) /* parent */		exit(0);	/*	 * Change the current working directory to the root so	 * we won't prevent file systems from being unmounted.	 */	if (chdir("/") < 0)		err_quit("%s: can't change directory to /");	/*	 * Close all open file descriptors.	 */	if (rl.rlim_max == RLIM_INFINITY)		rl.rlim_max = 1024;	for (i = 0; i < rl.rlim_max; i++)		close(i);	/*	 * Attach file descriptors 0, 1, and 2 to /dev/null.	 */	fd0 = open("/dev/null", O_RDWR);	fd1 = dup(0);	fd2 = dup(0);	/*	 * Initialize the log file.	 */	openlog(cmd, LOG_CONS, LOG_DAEMON);	if (fd0 != 0 || fd1 != 1 || fd2 != 2) {		syslog(LOG_ERR, "unexpected file descriptors %d %d %d",		  fd0, fd1, fd2);		exit(1);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -