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()の呼び出し後、親と子の2つのプロセスがあります。

親プロセスの場合、else部分が当てはまるため、newsockfdを閉じます。ただし、newsockfdは、dostuffメソッドでのシステムコールの読み取りと書き込みのために子プロセスによって使用されます。この場合、システムコールの読み取りと書き込みは失敗しませんか?

4

2 に答える 2

8

いいえ、fork開いているすべてのファイル記述子がコピーされ、同じ記述子ではないため、同じファイルを指しているだけです。

fork(2)マンページから:

子は、親の開いているファイル記述子のセットのコピーを継承します。子の各ファイル記述子は、親の対応するファイル記述子と同じ開いているファイルの説明(open(2)を参照)を参照します。これは、2つの記述子がオープンファイルステータスフラグ、現在のファイルオフセット、および信号駆動型I / O属性を共有することを意味します(fcntl(2)のF_SETOWNおよびF_SETSIGの説明を参照)。

于 2012-04-27T22:26:12.743 に答える
2

子プロセスは、独自のメモリに独自の新しい「newsockfd」を持ちます。そこにあるソケットハンドルには、閉じられている親の「newsockfd」との共通点はありません。

于 2012-04-27T22:26:29.610 に答える