2015-10-14 46 views
0

这是一个网站的代码。它使用多处理来创建服务器。我的问题是:父进程close(newsockfd)会在子进程doprocessing(newsockfd)之前执行吗?C:全局变量值中的多进程

#include <stdio.h> 
#include <stdlib.h> 

#include <netdb.h> 
#include <netinet/in.h> 

#include <string.h> 

void doprocessing (int sock); 

int main(int argc, char *argv[]) { 
    int sockfd, newsockfd, portno, clilen; 
    char buffer[256]; 
    struct sockaddr_in serv_addr, cli_addr; 
    int n, pid; 

    /* First call to socket() function */ 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

    if (sockfd < 0) { 
     perror("ERROR opening socket"); 
     exit(1); 
    } 

    /* Initialize socket structure */ 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    portno = 5001; 

    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 

    /* Now bind the host address using bind() call.*/ 
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { 
     perror("ERROR on binding"); 
     exit(1); 
    } 

    /* Now start listening for the clients, here 
     * process will go in sleep mode and will wait 
     * for the incoming connection 
    */ 

    listen(sockfd,5); 
    clilen = sizeof(cli_addr); 

    while (1) { 
     newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); 

     if (newsockfd < 0) { 
     perror("ERROR on accept"); 
     exit(1); 
     } 

     /* Create child process */ 
     pid = fork(); 

     if (pid < 0) { 
     perror("ERROR on fork"); 
     exit(1); 
     } 

     if (pid == 0) { 
     /* This is the client process */ 
     close(sockfd); 
     doprocessing(newsockfd); 
     exit(0); 
     } 
     else { 
     close(newsockfd); 
     } 

    } /* end of while */ 
} 

===-================= 
void doprocessing (int sock) { 
    int n; 
    char buffer[256]; 
    bzero(buffer,256); 
    n = read(sock,buffer,255); 

    if (n < 0) { 
     perror("ERROR reading from socket"); 
     exit(1); 
    } 

    printf("Here is the message: %s\n",buffer); 
    n = write(sock,"I got your message",18); 

    if (n < 0) { 
     perror("ERROR writing to socket"); 
     exit(1); 
    } 

} 

========== - =====

代码从这个网站: http://www.tutorialspoint.com/unix_sockets/socket_server_example.htm

回答

1

当进程分叉时,获取打开的文件描述符集合的副本,并且打开的文件引用计数相应地递增。 close只发生在父进程中的,所以孩子仍然保持对打开文件的引用。执行顺序并不重要。在多CP​​U系统上,它可能会同时发生。

全局变量不是由分叉子进程共享的。分叉进程运行在自己的虚拟内存空间中。

+0

应该是这样的:if(pid == 0){*这是客户端进程*/ close(sockfd); doprocessing(newsockfd);/*我添加了这个close语句 - > */close(newsockfd); exit(0); } else { close(newsockfd); } – user2373043

+0

一个文件desriptor是一个指针吗?为什么它被定义为一个整数? – user2373043

+0

@ user2373043 - 文件描述符是一个整数。你正在考虑FILE指针。 – alvits