unix网络编程学习--守护进程

本文介绍了一个简单的守护进程实现,并展示了如何使用socket编程处理客户端请求,包括错误处理和子进程管理。
/*
实现将字符加密,颠倒返回
*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
const char * end;
#define MAX 100
#define PORT 34561
#define LAN 8
#define OPEN_LINKER 56
void err_quit(const char *s)
{
    syslog(LOG_INFO|LOG_LOCAL3,"%s", s);
    exit(0);
}
void SyslogInfor(const char * s)
{
    syslog(LOG_INFO|LOG_LOCAL3,"%s", s);
    return ;
}
void err_child_progress(const int status)
{
    char buff[MAX];
    if(WIFEXITED(status))
    {
        err_quit("其终止状态是按照正常终止的\n");
        return;
    }
    else if(WIFSIGNALED(status))
    {
        snprintf(buff, MAX, "异常终止,其异常终止的ID是%d\n",WTERMSIG(status));
        err_quit(buff);
        return;
    }
    else if(WIFSTOPPED(status))
    {
        snprintf(buff, MAX, "当前暂停子进程,且子进程id是%d\n",WSTOPSIG(status));
        err_quit(buff);
        return ;
    }
}
int Socket(const int AF,const int SO,const int a)
{
    int sockfd;
    sockfd=socket(AF,SO,a);
    if(sockfd==-1)
        err_quit("socket error!");
    return sockfd;
}
int Bind(const int Sockfd,const struct sockaddr *server,socklen_t len)
{
    int bin;
    bin=bind(Sockfd, server, len);
    if(bin==-1)
        err_quit("bind error!");
    return bin;
}
int Listen(const int sockfd,const int lan)
{
    int listened;
    listened=listen(sockfd, lan);
    if(listened==-1)
        err_quit("listen error");
    return listened;
}
void guard_structure(const char *panem,int facility)
{
    pid_t pid;
    if((pid==fork())>0)
        _exit(0);
    else if(pid<0)
        err_quit("创建进程失败!\n");
    if(setsid()<0)
        err_quit("创建session leader失败\n");
    signal(SIGHUP, SIG_IGN);
    //忽略信号
    /*
     这里你还要考虑一下就是一个问题,如果你在打开一个终端的话依然可能造成其终止进程
     */
    if((pid=fork())>0)
        _exit(0);
    else if(pid<0)
        err_quit("二次守护进程失败!\n");
    //改变工作的路径到根目录下
    chdir("/");
    umask(0);
    /*
     关闭文件描述符,防止有描述符的占用
     */
    for(int i=0;i0);
    err_child_progress(status);
    return ;
}
void ControlingStringsTCP(const int con)
{
    /*
     防止服务器主机出现sigpipe信号的出现,造成服务器关闭,我们的设计就应该考虑的是用select函数防止服务器关闭出现。
     这样的情况是:一个进程向一个已收到RST的套接字上执行写操作内核就会发送一个sigpipe信号,终止信号。其捕获后应该做的是不加任何处理signal(sigpipe,sig_ign);返回的errno==EPiPE的
     */
    char sen[MAX],rec[MAX];
    int num,i,j;
    memset(sen, 0, MAX);
    memset(rec,0,MAX);
    while((num=(int)read(con, rec, MAX))>0)
    {
        rec[num]='\0';
        if(num>MAX)
            return ;
        j=strlen(rec);
        for(int k=0;k='a'&&rec[k]<='z')||(rec[k]>='A'&&rec[k]<='Z'))
            {
                rec[k]+=4;
                if((rec[k]>'Z'&&rec[k]<='Z'+4)||(rec[k]>'z'))
                    rec[k]-=4;
            }
        }
        rec[j]='\0';
        for(i=0;i0)
        {
            snprintf(buf, MAX, "from the client:%s:%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
            SyslogInfor(buf);
        }
        pid=fork();
        if(pid==0)
        {
            close(sockfd);
            ControlingStringsTCP(con);
            exit(0);
        }
        close(con);
    }
    return 0;
}

守护进程实现,unix网络编程学习让自己更美好!

MAC OS 配置守护进程:gcc 编译后  ,使用sudo 命令,用ps -ejf  查看进程id,进程其父进程为1(init进程);  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值