先写个守护进程试试。
需求:
守护进程在输入命令 demon fuck 的时候跳出来,回我个消息。
分析:
1. 守护进程可能就是脱离了控制台的一个程序。可以挂在父进程id=1的下面。
2.脱离控制台。
3.难度应该不大。
简单设计开始:
main.cpp文件
#include "fuckY.h"
/*
* fork() =-1 fail
* fork =0 child proccess
* fork >0 parent proccess
*/
/*
* signal(int sig, void * func(int sig)
* define when sig is raise ,how to do
*/
main(int argc, char **argv)
{
int child_pid;
int i=0 ,j=0,iRet=0;
if (argc < 2)
{
printf("usage: %s fuck\n", argv[0]);
return 0;
}
printf("argv[1] =[%s]\n", *(argv+1));
setSignal();
signal(SIGTERM, serverExit); //kill -15信号
signal(SIGCHLD, sig_child ); //子进程退出
signal(SIGABRT , serverExit); //kill -6信号
setSignal();
if ((child_pid=fork())<0)
{
printf("can't fork first child [%d]\n", errno, strerror(errno));
return FAILURE;
}
else if(child_pid>0) //保证不是组长进程
{
exit(0);
}
setsid();
if ((child_pid=fork())<0)
{
printf("can't fork secode child [%d][%s]\n", errno, strerror(errno));
return FAILURE;
}
else if(child_pid>0) //保证不是会话组长
{
exit(0);
}
while (1)
{
sleep(20);
i++;
if(!strncmp(argv[1], "fuck",4))
{
errno = 0;
if( (child_pid=fork()) < 0 )
{
printf("fork child proccess to do something\n");
exit(0);
}
if(child_pid > 0)
{
signal( SIGCHLD, sig_child );
exit(0);
}
iRet = fuckY(i);
if (iRet)
{
printf("exit fuckY\n");
return FAILURE;
}
}
}
printf("main is start ok[%d]\n",i);
exit(0);
}
|
fuckY.cpp文件
#include "fuckY.h"
int fuckY( int i)
{
printf( "I'm fuckY process %d\n", getpid() );
printf("hello every one![%d]\n", i);
return SUCCESS;
}
/**
* 子进程等待处理函数
*/
void sig_child(int signo)
{
pid_t pid;
int stat,i;
while((pid = waitpid(-1, &stat, WNOHANG)) > 0);
return;
}
/**
* 服务退出处理函数
*/
void serverExit(int signo)
{
printf("SERVER STOPED\n");
sleep( 1 );
exit( 0 );
}
/**
* 获取信号
*/
void catchSignal(int signo)
{
printf("receive signal no[%d]\n", signo);
signal(signo, catchSignal);
}
/**
* 设置信号捕获后的缺省处理
*/
int setSignal()
{
short i;
for( i=1;i<=63; ) {
if( i==19 ) { i++;continue ; }
switch ( i ) {
# ifdef SIGTTOU
case SIGTTOU:
# endif
# ifdef SIGTTIU
case SIGTTIN:
# endif
# ifdef SIGTSTP
case SIGTSTP:
# endif
case SIGIOT:
case SIGPIPE:
case SIGINT:
case SIGQUIT:
case SIGALRM:
case SIGTERM:
case SIGHUP:
case SIGCLD:
case SIGSEGV:
break ;
default:
signal( i,catchSignal );
break ;
}
if( i==25 ) { i = 27 ; continue ; }
else if ( i==39 )
{ i = 60 ; continue ; }
i ++ ;
}
# ifdef SIGTTOU
signal( SIGTTOU, SIG_IGN );
# endif
# ifdef SIGTTIN
signal( SIGTTIN, SIG_IGN );
# endif
# ifdef SIGTSTP
signal( SIGTSTP, SIG_IGN );
# endif
signal ( SIGHUP, SIG_IGN );
signal ( SIGIOT, SIG_IGN );
signal ( SIGPIPE, SIG_IGN );
signal ( SIGINT, SIG_IGN );
signal ( SIGQUIT, SIG_IGN );
signal ( SIGALRM, SIG_IGN );
}
|
fuckY.h文件
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#define SUCCESS 0
#define FAILURE -1
int fuckY( int i);
void sig_child(int signo);
void serverExit(int signo);
void catchSignal(int signo);
int setSignal();
|
|
文件: | demon.rar |
大小: | 2KB |
下载: | 下载 |
|
阅读(576) | 评论(0) | 转发(0) |