Linux下后台服务程序开发

该博客介绍了如何在Linux环境下开发后台服务程序,通过处理信号实现服务的启动和停止。主要内容包括设置程序退出标志、捕获信号函数、fork进程以实现守护进程,并通过读写PID文件进行进程管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 #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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值