Linux C 命令行

Linux 下C 命令行stop 和 restart对先后开始展览调节

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

#define PID_FILE "./p.pid"

void Exit_Process( int signal );
int Daemon_Init();

int main(int argc, char *argv[])
{
    signal( SIGHUP, SIG_IGN );              //终止进程 终端线路挂断
    signal( SIGINT, Exit_Process );     //终止进程 中断进程
    signal( SIGINT, Exit_Process );     //终止进程 中断进程
    signal( SIGQUIT, SIG_IGN );         //建立CORE文件 终止进程,并且生成core文件
    signal( SIGILL, SIG_IGN );              //建立CORE文件 非法指令

    signal( SIGTRAP, SIG_IGN );         //建立CORE文件 跟踪自陷
    signal( SIGABRT, SIG_IGN );
    signal( SIGBUS, SIG_IGN );              //建立CORE文件 总线错误
    signal( SIGFPE, SIG_IGN );              //建立CORE文件 浮点异常

    signal( SIGKILL, SIG_IGN );             //终止进程 杀死进程
    signal( SIGUSR1, SIG_IGN );         //终止进程 用户定义信号1
    signal( SIGSEGV, SIG_IGN );         //建立CORE文件 段非法错误
    signal( SIGUSR2, SIG_IGN );         //终止进程 用户定义信号1

    signal( SIGPIPE, SIG_IGN );         //终止进程 向一个没有读进程的管道写数据
    signal( SIGALRM, SIG_DFL );         //终止进程 计时器到时
    signal( SIGTERM, Exit_Process );        //终止进程 软件终止信号
    //signal( SIGCHLD,  SIG_IGN );      //忽略信号 当子进程停止或退出时通知父进程

    signal( SIGCONT, SIG_IGN );         //忽略信号 继续执行一个停止的进程
    signal( SIGSTOP,    SIG_IGN );          //停止进程 非终端来的停止信号
    signal( SIGTSTP,    SIG_IGN );          //停止进程 终端来的停止信号
    signal( SIGTTIN,    SIG_IGN );          //停止进程 后台进程读终端

    signal( SIGTTOU,    SIG_IGN );          //停止进程 后台进程写终端
    signal( SIGURG, SIG_IGN );              //忽略信号 I/O紧急信号
    signal( SIGXCPU, SIG_IGN );         //终止进程 CPU时限超时
    signal( SIGXFSZ, SIG_IGN );         //终止进程 文件长度过长

    signal( SIGVTALRM, SIG_IGN );       //终止进程 计时器到时
    signal( SIGPROF, SIG_IGN );         //终止进程 统计分布图用计时器到时
    signal( SIGWINCH, SIG_IGN );            //忽略信号 窗口大小发生变化
    signal( SIGIO, SIG_IGN );               //忽略信号 描述符上可以进行I/O

    signal( SIGPWR, Exit_Process );     //系统停电
    signal( SIGSYS, SIG_IGN );              //

    signal( SIGUSR1, Exit_Process );        //使用30信号中断进程
/////////////////////////////////////////////////////////////////////////////
    char syscom[32];
    FILE *fp1, *fp2;

    if (argc == 2)
    {
        if (strcasecmp(argv[1], "stop") == 0)
        {
            //kill掉上一个进程,并且退出本程序
            FILE *fp;
            char ps[16];
            if ((fp = fopen(PID_FILE, "rb")) != 0)
            {
                memset(ps, 0, 16);
                fread(ps, sizeof(char), 16, fp);
                fclose(fp);
                memset(syscom, 0, 32);
                sprintf(syscom, "kill -30 %s", ps);
                system(syscom);
            }
            return 0;
        }
        if (strcasecmp(argv[1], "restart") == 0)
        {
            //kill掉上个进程 继续本进程
            FILE *fp;
            char ps[16];
            if ((fp = fopen(PID_FILE, "rb")) != 0)
            {
                memset(ps, 0, 16);
                fread(ps, sizeof(char), 16, fp);
                fclose(fp);
                memset(syscom, 0, 32);
                sprintf(syscom, "kill -30 %s", ps);
                system(syscom);
                sleep(1);
            }
        }
        else
        {
            //直接退出
            return 0;
        }
    }
    else if (argc > 2)
    {
        return 0;
    }

    Daemon_Init();

    if ((fp1 = fopen(PID_FILE, "rb")) != 0)
    {
        fclose(fp1);
        return 0;
    }
    else if ((fp2 = fopen(PID_FILE, "wb")) != 0)
    {
        char temp[16];
        memset(temp, 0, 16);
        sprintf(temp, "%d", getpid());
        fwrite(temp, sizeof(char), strlen(temp), fp2);
        fclose(fp2);

        memset(syscom, 0, 32);
        sprintf(syscom, "chmod -R 400 %s", PID_FILE);
        system(syscom);
    }

    //
    sleep(10);

    //退出删除pid文件
    memset(syscom, 0, 32);
    sprintf(syscom, "rm -f %s", PID_FILE);
    system(syscom);

    return 1;
}

void Exit_Process( int signal )
{
    char syscom[32];
    memset(syscom, 0, 32);
    sprintf(syscom, "rm -f %s", PID_FILE);
    system(syscom);
}

int Daemon_Init()
{
    pid_t pid = 0;
    int ret = 0;

    if ((pid = fork()) < 0)
    {
        return 0;
    }
    else if ( pid != 0 )
    {
        exit(0);
    }
    else
    {
        /* 子进程继续 */
        if ((ret = setsid()) < 0)   //become session leader
        {
            return 0;
        }
        //关闭标准出入、输出
        close( 1 );
        close( 2 );
    }
    return 1;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注