Linux下后台服务程序开发
来源:互联网 发布:登山装备知乎 编辑:程序博客网 时间:2024/06/05 05:02
#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后台服务程序练习开发
- 后台服务程序开发
- 后台服务程序开发模式
- 后台服务程序开发(完整版)
- 后台服务程序开发一至四
- 后台服务程序开发模式
- 后台服务程序开发模式
- 开发 Linux 后台服务进程
- 开发 Linux 后台服务进程
- 开发 Linux 后台服务进程
- 开发 Linux 后台服务进程
- 开发Linux后台服务进程
- Linux下后台运行程序
- C++后台服务程序开发模式
- C++后台服务程序开发模式
- C++后台服务程序开发模式
- windows 7 后台服务程序开发
- COM对象创建过程总结(进程外和进程内)
- API Hook完全手册
- 秀丸 SN
- 转贴一篇Matt Pietrek的关于SEH的文章
- MFC中PretranslateMessage的实现
- Linux下后台服务程序开发
- 转贴:Apple操作系统的历史
- Warning C4150的原因和解决办法
- 转贴:Objective-C Tutorial
- 如何在程序启动的时候自动挂接Debugger
- Mac OS X Programming读书笔记1 - 系统架构
- Mac OS X Programming读书笔记2 - HelloWorld
- Mac OS X Programming读书笔记3 - 事件处理
- MFC的模块状态:从AfxGetApp()和AFX_MANAGE_STATE()看MFC的模块状态