TCP回射程序第二版

image.png

当不处理子进程的SIGCHLD信号时,确实会进入僵死状态
所以要用signal函数处理它

#include "unp.h"
void sig_chld(int signo);
int
main(int argc,char ** argv)
{
        struct sockaddr_in servaddr,cliaddr;
        bzero(&servaddr,sizeof(servaddr));
        if(argc==2)
                servaddr.sin_port=atoi(argv[1]);
        else if(argc==3){
                servaddr.sin_port=atoi(argv[2]);
                inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
        }
        else{
                printf("usage: [] [port]\n");
                exit(0);
        }
        servaddr.sin_family=AF_INET;
        int fd;
        fd=socket(AF_INET,SOCK_STREAM,0);
        bind(fd,(struct sockaddr*)&servaddr,sizeof(servaddr));
        listen(fd,5);
        int connfd;socklen_t clilen;
        void sig_chld(int);
        Signal(SIGCHLD,sig_chld);
        for(;;){
                connfd=accept(fd,(struct sockaddr*)&cliaddr,&clilen);
                printf("guess is coming\n");
                char rbuf[2000],wbuf[2000];
                int n=-1;
                int childpid;
                if((childpid=fork())==0){

                        for(;;){
                                n=read(connfd,rbuf,2000);
                                if(n==0)
                                        break;
                                write(connfd,rbuf,n);
                        }
                        exit(0);
                }
                close(connfd);
        }
}



void
sig_chld(int signo)
{
        pid_t pid;
        int stat;
        while((pid=waitpid(-1,&stat,WNOHANG))>0)
                printf("child %d terminated\n",pid);
        return;
}

#include 
pid_t fork(void);
//返回:在子进程中为0,在父进程中为子进程ID,出错为-1

waitpid和wait函数:https://www.jianshu.com/p/7a9639d210d2

你可能感兴趣的:(TCP回射程序第二版)