[root@localhost tcpip]# cat ./echo_mpserver.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <signal.h>

#define BUF_SIZE 1024
void error_handling(char *message);
void read_childproc(int sig);

int main(int argc, char *argv[]){
        int serv_sock, clnt_sock;
        struct sockaddr_in serv_addr, clnt_addr;
        socklen_t addr_size;
        int str_len, state;
        struct sigaction act;
        pid_t pid;
        char message[BUF_SIZE];

        if(argc!=2){
                printf("Usage : %s <PORT> \n",argv[0]);
                exit(1);
        }
        act.sa_handler=read_childproc;
        sigemptyset(&act.sa_mask);
        act.sa_flags=0;
        state=sigaction(SIGCHLD, &act, 0);

        serv_sock=socket(PF_INET, SOCK_STREAM, 0);
        memset(&serv_addr, 0, sizeof(serv_addr));
        serv_addr.sin_family=AF_INET;
        serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
        serv_addr.sin_port=htons(atoi(argv[1]));

        if(bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1){
                error_handling("bind() error");
        }
        if(listen(serv_sock, 5)==-1){
                error_handling("listen() error");
        }

        while(1)
        {
                addr_size=sizeof(clnt_addr);
                clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr, &addr_size);
                if(clnt_sock==-1){
                        continue;
                }
                else{
                        puts("New Client connected...\n");
                }
                pid=fork();
                if(pid==-1){
                        close(clnt_sock);
                        continue;
                }
                if(pid==0){
                        close(serv_sock);
                        while((str_len=read(clnt_sock, message, BUF_SIZE))!=0)
                        {
                                write(clnt_sock, message, str_len);
                        }
                        close(clnt_sock);
                        return 0;
                }
                else{
                        close(clnt_sock);
                }
        }
        close(serv_sock);
        return 0;
}

void error_handling(char *message){
        fputs(message, stderr);
        fputc('\n', stderr);
        exit(1);
}

void read_childproc(int sig){
        pid_t pid;
        int status;
        pid=waitpid(-1, &status, WNOHANG);
        printf("removed child process : %d \n", pid);
        printf("child process send : %d \n", WEXITSTATUS(status));
}