Родительский и дочерний процесс, сокет закрыт - PullRequest
2 голосов
/ 27 февраля 2011

Я застрял в этом фрагменте кода, который имитирует взаимодействие сервер-клиент. Предположим, что sockfd - дескриптор файла сокета, созданный на стороне сервера.

Мой вопрос заключается в том, что пока родительский и его дочерний процессы выполняются «одновременно», и во время дочернего временного интервала он закрывает сокет сервера sockfd , а затем, когда поток выполнения, скажем, второй временной цикл, вызывающий функцию accpet, допустим ли там параметр sockfd , закрыт ли он дочерним процессом, т. е. удален из таблицы дескрипторов файла ядра?

while (1) {
    //accept a connection from client,get the new socket from client
                       //is the sockfd valid here,is it closed by the child in
                       //the previous loop
     newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr, &clilen); 

     if (newsockfd < 0) 
         error("ERROR on accept");
     pid = fork();
     if (pid < 0)
         error("ERROR on fork");
     if (pid == 0)  {
         close(sockfd);  // can't this cause problem ??
         dostuff(newsockfd);
         exit(0);
     }
     else close(newsockfd);
 } /* end of while */

Ответы [ 4 ]

6 голосов
/ 28 февраля 2011

В этом фрагменте кода:

if (pid == 0)  {
     close(sockfd);  // can't this cause problem ??
     dostuff(newsockfd);
     exit(0);
 }

* close() влияет только на дочернюю копию файлового дескриптора sockfd.

Копия родителя по-прежнему открыта для использования, затемвремя вокруг цикла.

Для дочерних процессов считается хорошим способом закрыть ненужные унаследованные файловые дескрипторы.

0 голосов
/ 31 августа 2012

Может показаться, что когда вы закрываете дублированные fd, он на самом деле не закрывает поток, пока все не будут закрыты.Я столкнулся с этим с созданным мной просто для удовольствия веб-сервером.Я закрыл fd в форке, но он остался открытым.

Я исправил его, закрыв в родительском объекте после вилки.

0 голосов
/ 27 февраля 2011

При каждом вызове функции fork() дочерний процесс дублирует текущий процесс.Следовательно, во втором цикле sockfd в дочернем процессе совпадает с родительским процессом (который еще не закрыт).Так оно и есть.

0 голосов
/ 27 февраля 2011

Ничто из того, что делает родитель, не приведет к закрытию дескриптора дочернего файла в том смысле, который вы имеете в виду. Операции над ним вернут соответствующий статус в зависимости от ситуации, но этот номер никогда не будет возвращен open или dup, пока дочерний процесс не вызовет close.

...