2015-10-14 44 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