您的位置:首页 > 运维架构 > Linux

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: