1. 程式人生 > >Linux子程序繼承父程序的檔案描述符

Linux子程序繼承父程序的檔案描述符

/* tcp_server.c */  
  
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <errno.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>   
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <signal.h>


#define MAXLINE 1024  
#define BACKLOG 50  


int main(int argc, char** argv)  
{   
	int    listenfd, connfd, n = 0;     
    struct sockaddr_in  servaddr, cliaddr;     
    pid_t pid;      
    socklen_t clilen;  

	signal(SIGCHLD, SIG_IGN); //避免子程序成為殭屍程序  
    
    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){      
        printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);      
        return -1;      
    }      
	
    memset(&servaddr, 0, sizeof(servaddr));      
    servaddr.sin_family = AF_INET;          		//IPv4  
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);   //自動填入本機的IP地址    
    /*
    if( inet_pton(AF_INET, "172.23.1.180", &servaddr.sin_addr) <= 0){   // [將“點分十進位制”ip-> 網路位元組序“整數”ip]   
        printf("inet_pton error for %s\n","172.23.1.180");      
        return -1;    
    }
    	*/
	
    servaddr.sin_port = htons(6666);        //將埠號轉換為網路位元組序  
    if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){      
        printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);      
        return -1;      
    }  
	
    if( listen(listenfd, BACKLOG) == -1){      
        printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);      
        return -1;      
    }  
	
    printf("======waiting for client's connect requestion======\n");   
    
    while(1){              
        if( (connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen)) == -1){          
            printf("accept socket error: %s(errno: %d)", strerror(errno),errno);          
            continue;      
        } 

		if ((pid = fork()) < 0) {
			perror("fork");
			return -1;
		} 
		else if (pid == 0) {	//child process
			char    buff[MAXLINE];

			close(listenfd);
	        fprintf(stdout, "Connected, client addr: %s\n", inet_ntoa(cliaddr.sin_addr));  
	        if((n = recv(connfd, buff, MAXLINE-1, 0)) < 0) {  
	            printf("Failed to receive bytes from client\n");  
	            return -1; 
	        }      
	        buff[n] = '\0';      
	        fputs("recv msg from client: ", stdout);  
	        fputs(buff, stdout);  
	        while (n > 0) {  
	            if (send(connfd, buff, n, 0) != n) {  
	                printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);      
	                return -1;   
	            }   
	            if((n = recv(connfd, buff, MAXLINE-1, 0)) < 0) {  
	                printf("Failed to receive bytes from client\n");  
	                return -1; 
	            }      
	            buff[n] = '\0';      
	            fputs(buff, stdout);  
	        }  
	        close(connfd);
			exit(0);
		}
		else {					//parent process
			close(connfd);
			continue;
		}     
    }  

	return 0;
}  

客戶端程式碼tcp_client.c