- 论坛徽章:
- 0
|
//检查或修改与指定信号相关联的处理动作(可同时两种操作)
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);
}
|
|