in the book "advanced programming in the unix environment"

the authors give the following function to "deamonize" a process

void daemonize(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); 
	} 
}

the basic part of it being :: fork() and the then kill the parent.... How you this function insures that you won't get a zombie process?

Isn't terminating the parent before the child the way to create a zombie process?

PS::from the few things i've seen so far, it seems to me that socket programming{with seperate processes in local host} isn't that difficult but it can have bugs in places you least expect them..Specially if you don't have a thorough understanding of the functions you are using {i.e. io functions, general system calls,etc}....

As I understand it, the double-fork ensures that the daemon process becomes a child process of init, which never exists.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.