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

来源:互联网 发布:淘宝试用联盟网 编辑:程序博客网 时间:2024/05/16 18:59
/*实现将字符加密,颠倒返回*/#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 56void 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进程);  

原创粉丝点击