Linux下后台服务程序开发
2007-12-14 12:58
417 查看
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
static volatile int gIsExit = 1; /*程序退出标识*/
/*******************************************************************/
static void UsageInfo(const char * argv); /*用法提示*/
static void CatchSignal(int signo); /*捕捉信号*/
int main(int argc, char * argv[])
{
//公用变量
char sPidFileName[256];
//文件控制变量
struct stat fstat;
pid_t Pid;
FILE * fpPid;
int ret = 0;
int flag = 0;
char buf[1024] = {0};
if ( argc != 2 ) {
UsageInfo(argv[0]);
exit(0);
}
sprintf(sPidFileName, "/tmp/WDKMS.PID");
if ( strcasecmp(argv[1],"stop") == 0 ) {
if ( stat(sPidFileName, &fstat) < 0 ) {
printf("[%s] isn't runing!/n", argv[0]);
exit(0);
}
if ( fstat.st_uid != geteuid() ) {
printf("stop failed!/n", argv[0]);
exit(0);
}
if ( (fpPid = fopen(sPidFileName, "r")) == NULL ) {
printf("open [%s] error!/n", argv[0]);
exit(0);
}
fscanf(fpPid,"%d",&Pid);
fclose(fpPid);
printf("[%s] stoping....../n", argv[0]);
if ( kill(Pid,SIGUSR1) != 0 ) {
printf("[%s] send signal failed!/n", argv[0]);
exit(0);
}
while ( stat(sPidFileName, &fstat)==0 ){
printf("waiting.../n");
apr_sleep(apr_time_from_sec(1));
}
printf("DONE!/n", argv[0]);
exit(0);
} else if ( strcasecmp(argv[1],"start") != 0 ) {
UsageInfo(argv[0]);
exit(0);
}
if ( stat(sPidFileName, &fstat)==0 ) {
printf("[%s] is exist!/n", argv[0]);
exit(0);
} else {
/* 将程序转入后台运行,成为守护程序 */
if ( fork() > 0 ) exit(0);
setsid();
if ( fork() > 0 ) exit(0);
/* 把本程序的pid写入 /tmp/HSMServer_pid 中*/
if ( (fpPid = fopen(sPidFileName, "w")) == NULL ) {
printf("create [%s] failed!", sPidFileName);
exit(0);
}
Pid = getpid();
fprintf(fpPid,"%d",Pid);
fclose(fpPid);
}
if ( server_start("HSM.ini") != 0 ) {
goto quit;
}
signal(SIGUSR1, CatchSignal);
while ( gIsExit ) {
apr_sleep(apr_time_from_sec(SLEEP_TIME));
}
quit:
server_close();
KMS_LogEntry("main", "exit DONE", 0);
if ( remove(sPidFileName) != 0 ) {
printf("app exit! rm pid failed!/n");
}
return 0;
}
static void CatchSignal( int signo)
{
gIsExit = 0;
return;
}
static void UsageInfo(const char * argv)
{
printf("Usage:/n/t %s start|stop/n",argv);
}
#include <sys/stat.h>
#include <signal.h>
static volatile int gIsExit = 1; /*程序退出标识*/
/*******************************************************************/
static void UsageInfo(const char * argv); /*用法提示*/
static void CatchSignal(int signo); /*捕捉信号*/
int main(int argc, char * argv[])
{
//公用变量
char sPidFileName[256];
//文件控制变量
struct stat fstat;
pid_t Pid;
FILE * fpPid;
int ret = 0;
int flag = 0;
char buf[1024] = {0};
if ( argc != 2 ) {
UsageInfo(argv[0]);
exit(0);
}
sprintf(sPidFileName, "/tmp/WDKMS.PID");
if ( strcasecmp(argv[1],"stop") == 0 ) {
if ( stat(sPidFileName, &fstat) < 0 ) {
printf("[%s] isn't runing!/n", argv[0]);
exit(0);
}
if ( fstat.st_uid != geteuid() ) {
printf("stop failed!/n", argv[0]);
exit(0);
}
if ( (fpPid = fopen(sPidFileName, "r")) == NULL ) {
printf("open [%s] error!/n", argv[0]);
exit(0);
}
fscanf(fpPid,"%d",&Pid);
fclose(fpPid);
printf("[%s] stoping....../n", argv[0]);
if ( kill(Pid,SIGUSR1) != 0 ) {
printf("[%s] send signal failed!/n", argv[0]);
exit(0);
}
while ( stat(sPidFileName, &fstat)==0 ){
printf("waiting.../n");
apr_sleep(apr_time_from_sec(1));
}
printf("DONE!/n", argv[0]);
exit(0);
} else if ( strcasecmp(argv[1],"start") != 0 ) {
UsageInfo(argv[0]);
exit(0);
}
if ( stat(sPidFileName, &fstat)==0 ) {
printf("[%s] is exist!/n", argv[0]);
exit(0);
} else {
/* 将程序转入后台运行,成为守护程序 */
if ( fork() > 0 ) exit(0);
setsid();
if ( fork() > 0 ) exit(0);
/* 把本程序的pid写入 /tmp/HSMServer_pid 中*/
if ( (fpPid = fopen(sPidFileName, "w")) == NULL ) {
printf("create [%s] failed!", sPidFileName);
exit(0);
}
Pid = getpid();
fprintf(fpPid,"%d",Pid);
fclose(fpPid);
}
if ( server_start("HSM.ini") != 0 ) {
goto quit;
}
signal(SIGUSR1, CatchSignal);
while ( gIsExit ) {
apr_sleep(apr_time_from_sec(SLEEP_TIME));
}
quit:
server_close();
KMS_LogEntry("main", "exit DONE", 0);
if ( remove(sPidFileName) != 0 ) {
printf("app exit! rm pid failed!/n");
}
return 0;
}
static void CatchSignal( int signo)
{
gIsExit = 0;
return;
}
static void UsageInfo(const char * argv)
{
printf("Usage:/n/t %s start|stop/n",argv);
}
相关文章推荐
- linux后台服务程序练习开发
- 开发Linux 服务程序与windows service程序的主要区别
- 解决Linux关闭终端(关闭SSH等)后运行的程序或者服务自动停止【后台运行程序】
- C++后台服务程序开发模式
- C++学习笔记-后台服务程序开发模式
- 解决Linux关闭终端(关闭SSH等)后运行的程序或者服务自动停止【后台运行程序】
- 后台服务程序开发一至四
- 让Java程序作为linux的Daemon后台运行 和 使用Java Service Wrapper将java程序作为linux服务并且开机自动启动
- 微信小程序,腾讯云node环境后台koa2开发框架(本地调试、接口、静态文件服务、文件长传服务)
- 后台服务程序开发
- linux下后台服务程序的启动
- Linux后台服务开发笔记一 -- Linux进程Daemon化详解[转载]
- C++后台服务程序开发模式
- zz: C++后台服务程序开发模式
- C++后台服务程序开发模式
- windows 7 后台服务程序开发
- 后台服务程序开发
- 后台服务程序开发模式
- 线程多线程百度公开课 - linux后台服务开发 - 笔记整理
- C++后台服务程序开发模式