daemonize.c

来自「miniupnpd可以在嵌入式linux中实现upnp功能」· C语言 代码 · 共 130 行

C
130
字号
/* $Id: daemonize.c,v 1.11 2008/01/29 13:04:45 nanard Exp $ *//* MiniUPnP project * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/ * (c) 2006 Thomas Bernard  * This software is subject to the conditions detailed * in the LICENCE file provided within the distribution */#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <syslog.h>#include <string.h>#include <signal.h>#include "daemonize.h"#include "config.h"#ifndef USE_DAEMONintdaemonize(void){	int pid, i;	switch(fork())	{	/* fork error */	case -1:		perror("fork()");		exit(1);		/* child process */	case 0:		/* obtain a new process group */		if( (pid = setsid()) < 0)		{			perror("setsid()");			exit(1);		}		/* close all descriptors */		for (i=getdtablesize();i>=0;--i) close(i);				i = open("/dev/null",O_RDWR); /* open stdin */		dup(i); /* stdout */		dup(i); /* stderr */		umask(027);		chdir("/"); /* chdir to /tmp ? */					return pid;	/* parent process */	default:		exit(0);	}}#endifintwritepidfile(const char * fname, int pid){	char pidstring[16];	int pidstringlen;	int pidfile;	if(!fname || (strlen(fname) == 0))		return -1;		if( (pidfile = open(fname, O_WRONLY|O_CREAT|O_EXCL, 0666)) < 0)	{		syslog(LOG_ERR, "Unable to open pidfile for writing %s: %m", fname);		return -1;	}	pidstringlen = snprintf(pidstring, sizeof(pidstring), "%d\n", pid);	if(pidstringlen <= 0)	{		syslog(LOG_ERR, 			"Unable to write to pidfile %s: snprintf(): FAILED", fname);		close(pidfile);		return -1;	}	else	{		if(write(pidfile, pidstring, pidstringlen) < 0)			syslog(LOG_ERR, "Unable to write to pidfile %s: %m", fname);	}	close(pidfile);	return 0;}intcheckforrunning(const char * fname){	char buffer[64];	int pidfile;	pid_t pid;	if(!fname || (strlen(fname) == 0))		return -1;	if( (pidfile = open(fname, O_RDONLY)) < 0)		return 0;		memset(buffer, 0, 64);		if(read(pidfile, buffer, 63))	{		if( (pid = atol(buffer)) > 0)		{			if(!kill(pid, 0))			{				close(pidfile);				return -2;			}		}	}		close(pidfile);		return 0;}

⌨️ 快捷键说明

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