?? daemoncon.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;
}
}
/* 初始化服務(wù) */
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;
}
}
/* 服務(wù)控制 */
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;
}
//開啟服務(wù)
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;
}
//停止服務(wù)
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;
}
/* 重啟服務(wù) */
int Restart(char *app, int (*FtpServer)(void))
{
Shutdown(app);
return Startup(app, FtpServer);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -