fork之后关闭的描述符是否会在其他进程中无效?

时间:2012-04-27 22:22:17

标签: c sockets

我在这个link中引用了以下代码段:

while (1)
 {
   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);
     dostuff(newsockfd);
     exit(0);
   }
   else
     close(newsockfd);
 } /* end of while */

void dostuff (int sock)
{
   int n;
   char buffer[256];

   bzero(buffer,256);
   n = read(sock,buffer,255);
   if (n < 0) error("ERROR reading from socket");
   printf("Here is the message: %s\n",buffer);
   n = write(sock,"I got your message",18);
   if (n < 0) error("ERROR writing to socket");
}

在fork()调用之后,会有两个进程 - Parent和child。

对于父进程,else部分保持为true,因此它将关闭newsockfd。但是,子进程使用newsockfd在dostuff方法中进行读写系统调用。在这种情况下,读写系统调用是否会失败?

2 个答案:

答案 0 :(得分:8)

不,因为在fork期间所有打开的文件描述符都被复制并且它们不是相同的描述符,它们只是指向同一个文件。

来自fork(2) manpage

  

子进程继承父进程打开文件的副本   描述。子中的每个文件描述符都指向相同的open   文件描述(参见open(2))作为相应的文件描述符   父母。这意味着两个描述符共享打开文件状态   标志,当前文件偏移和信号驱动的I / O属性(参见   fcntl(2)中的F_SETOWN和F_SETSIG的描述。

答案 1 :(得分:2)

子进程将在其自己的内存中拥有自己的全新“newsockfd”。那里的套接字句柄与正在关闭的父级'newsockfd'没有任何共同之处。