免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1846 | 回复: 0
打印 上一主题 下一主题

[系统] 下面是我在linux下写的守护进程,现在想收到SIGUSR1的信号后跳出while循环,该怎么写 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-21 10:29 |只看该作者 |倒序浏览
//检查或修改与指定信号相关联的处理动作(可同时两种操作)
static void (*set_signal(int signo,void(*func)(int)))(int)
{
        struct sigaction act,oact;
        act.sa_handler=func;
        sigemptyset(&act.sa_mask);
        act.sa_flags=0;
        if(signo!=SIGALRM) act.sa_flags|=SA_RESTART;
        if(sigaction(signo,&act,&oact)<0) return NULL;
        return(oact.sa_handler);
}

static void sig_routine(int signo)
{
        switch(signo)
        {
                case SIGCHLD:
                        while(waitpid(-1,NULL,WNOHANG)>0);
                        break;
        }
        return;
}

void printdot()
{
        printf("............");
}

int findpid(char* name)
{
        char buf[100];
        sprintf(buf, "ps -A | grep -w %s", name);
        FILE *fp = popen(buf, "r");
        if (fgets(buf, sizeof(buf), fp) != NULL)
        {
                return atoi(buf);
        }
        pclose(fp);
        return -1;
}

void close_server(int signo)
{
        int pid = 0;
        pid = findpid("Server");
        kill(pid, SIGKILL);
}

void scan_server()   //./Server
{
        char buf[100];
        char *name = "./Server";
        sprintf(buf,"ps -al | grep  %s",name);

        FILE *fp ;


        /*判断服务器是否存在*/
        if((fp = popen(buf,"r")) == NULL)
                exit(0);

        char *p = "R";
        char *q = "S";

        while(fgets(buf,sizeof(buf),fp))
        {
                if(!(strstr(buf,p) || strstr(buf,q)))
                {
                        void close_server();

                }

        }
        pclose(fp);
}
void make_daemon()
{
        pid_t pid;
        if((pid=fork())!=0)exit(0);       //结束父进程
        setsid();                        //脱离控制终端,登录会话和进程组
        while(1)
        {
                set_signal(SIGHUP,SIG_IGN);                //终端关闭时,驱动程序会发信号SIGHUP给session首进程也就是SHELL
                set_signal(SIGCHLD,sig_routine); //sig_routine()信号处理,收到SIGCHLD调用waitpid()避免僵尸进程
                scan_server();
                sleep(10);
                if(set_signal(SIGUSR1,))
        }
        if((pid=fork())!=0)exit(0);      //第二子进程继续(第二子进程不再是会话组长) 禁止进程重新打开控制终端

        chdir("/");
        umask(0);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP