2

我指的是来自此链接的以下代码片段:

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() 调用之后,将有两个进程 - 父进程和子进程。

对于父进程,else 部分成立,因此它将关闭 newsockfd。但是newsockfd被子进程用于dostuff方法中的读写系统调用。这种情况下读写系统调用不会失败吗?

4

2 回答 2

8

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

fork(2)手册页

子继承父的一组打开文件描述符的副本。子文件中的每个文件描述符与父文件中的相应文件描述符引用相同的打开文件描述(请参阅 open(2))。这意味着两个描述符共享打开文件状态标志、当前文件偏移量和信号驱动的 I/O 属性(参见 fcntl(2) 中对 F_SETOWN 和 F_SETSIG 的描述)。

于 2012-04-27T22:26:12.743 回答
2

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

于 2012-04-27T22:26:29.610 回答