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

📄 daemoncon.c

📁 福建博洋教育C/C++软件项目实战Linux网络编程阶段:FTP服务器开发
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/param.h>
#include <signal.h>
#include <sys/types.h>

#include "DaemonCon.h"
#include "Public.h"

/* 获取进程与子进程ID */
int GetAllPid(char *app, char *result)
{
	int pi[2];
	if (pipe(pi) == -1)
	{
		fprintf(stderr, "create pipe error!");
		return -1;
	}

	switch(fork())
	{
		case -1:
			fprintf(stderr, "GetAllPid Fork fail!");
			return -1;
		case 0:
			close(1);
			dup(pi[1]);
			close(pi[0]);
			close(pi[1]);
			
			execlp("pidof", "pidof", app, 0);
			exit(0);
		default:
			close(pi[1]);
			read(pi[0], result, MAX_BUF_SIZE);
			return 0;
	}
}

/* 初始化服务 */
int Init_Daemon()
{
	int res, res2, flag;
	if ((res = fork()) == 0)
	{
		setsid();
		if ((res2 = fork()) == 0)
		{
			umask(0);
			return 0;
		}	
		else if (res2 == -1)
			flag = 1;
		else
			exit(-1);
	}
	else if (res == -1)
		flag = 1;
	else
		exit(-1);

	if (flag)
	{
		fprintf(stderr, "[  Fail  ]\n");
		return -1;
	}
}

/* 服务控制 */
int Daemon_Contral(int argc, char **argv, int (*FtpServer)(void))
{
	if (argc == 1)
	{
		fprintf(stderr, "Usage: iFtp {start | stop | restart}\n");
		return -1;
	}

	if (strcmp(*(argv+1), "start") == 0)
		return Startup(*argv, FtpServer);
	else if (strcmp(*(argv+1), "stop") == 0)
		return Shutdown(*argv);
	else if (strcmp(*(argv+1), "restart") == 0)
		return Restart(*argv, FtpServer);
	else
	{
		fprintf(stderr, "Usage: iFtp {start | stop | restart}\n");
		exit(-1);
	}

	return 0;
}

//开启服务
int Startup(char *app, int (*FtpServer)(void))
{
	if (getuid() != 0)
	{
		fprintf(stderr, "Please use root to start iFtp!\n");
		return -1;
	}

	pid_t tpid = getpid();
	char res[MAX_BUF_SIZE], *tmp;
	char buf[10];
	int result;

	memset(res,0,sizeof(res));
	GetAllPid(app, res);

	tmp = res;

	int i;
	while(*tmp)
	{
		memset(buf, 0, sizeof(buf));
		i = 0;
		while (isspace(*tmp))
			tmp++;
		while (*tmp && !isspace(*tmp))
			buf[i++] = *tmp++;

		if (*buf == '\0')
			break;

		result = atoi(buf);
		if (tpid != result)
		{
			fprintf(stderr, "iFtp is runiing!\n");
			exit(-1);
		}
	}

	printf("Ftp Server Starting ");
	fflush(stdout);
	for (i=0; i<40; i++)
	{
		putchar('.');
		fflush(stdout);
		usleep(10000);
	}
	printf("[  OK  ]\n");

	Init_Daemon();
	FtpServer();

	return 0;
}

//停止服务
int Shutdown(char *app)
{
	pid_t curpid = getpid();

	int i, j = 0;
	char res[MAX_BUF_SIZE], *tmp;
	char buf[10];

	tmp = res;
	GetAllPid(app, res);

	if (!strchr(res, ' '))
	{
		fprintf(stderr, "iFtp is not starting!\n");
		return -1;
	}

	printf("Ftp Server Stoping  ");
	fflush(stdout);
	while(*tmp)
	{
		memset(buf, 0, sizeof(buf));
		i = 0;
		while (isspace(*tmp))
			tmp++;
		while (*tmp && !isspace(*tmp))
			buf[i++] = *tmp++;

		if (*buf == '\0')
			break;

		pid_t pid;
		pid = atoi(buf);
		if (pid != curpid && pid != 0)
		{
			j++;
			kill(pid, SIGTERM);
		}
	}

	for (i=0; i<40; i++)
	{
		putchar('.');
		fflush(stdout);
		usleep(10000);
	}

	printf("[  OK  ]\n");

	sid = shmget(shmkey, sizeof(struct state_struct), 0666 | IPC_CREAT);
	sMemory = shmat(sid, NULL, 0);

	union semun sem_union;
	int semid = semget(semkey, 1, 0666);
	if (semctl(semid, 0, IPC_RMID, sem_union) == -1);

	if (shmdt(sMemory) == -1);
	if (shmctl(sid, IPC_RMID, 0) == -1);

	return 0;
}

/* 重启服务 */
int Restart(char *app, int (*FtpServer)(void))
{
	Shutdown(app);
	return Startup(app, FtpServer);
}

⌨️ 快捷键说明

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