Chinaunix首页 | 论坛 | 博客
  • 博客访问: 146292
  • 博文数量: 39
  • 博客积分: 993
  • 博客等级: 准尉
  • 技术积分: 335
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-14 16:36
个人简介

https://github.com/dengdaiyemanren

文章分类

全部博文(39)

文章存档

2015年(1)

2012年(3)

2011年(27)

2010年(4)

2008年(4)

分类:

2010-12-18 19:03:19

先写个守护进程试试。
需求:
     守护进程在输入命令 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) |
0

上一篇:没有理想

下一篇:进程间关系chapter09

给主人留下些什么吧!~~