-1

このコードの太字部分が何をしているのか誰かが私に説明できますか?

     while ( 1 )
  {

    **FD_ZERO( &readfds );
    FD_SET( 0, &readfds );   /* add stdin */
    FD_SET( sock, &readfds );**

/* BLOCK on select() */
**select( FD_SETSIZE, &readfds, NULL, NULL, NULL );**

**if ( FD_ISSET( 0, &readfds ) )**
{
  char msg[1024];
  scanf( "%[^\n]", msg );  /* read everything up to the '\n' */
  getchar();  /* read (skip) the '\n' character */

  /* write the message to the socket connection */
  int n = write( sock, msg, strlen( msg ) );
  if ( n < strlen( msg ) )
  {
    perror( "write() failed" );
    return EXIT_FAILURE;
  }
}

**if ( FD_ISSET( sock, &readfds ) )**
{
  char buffer[1024];
  int n = read( sock, buffer, 1024 );
  if ( n < 1 )
  {
    perror( "read() failed" );
  }
  else
  {
    buffer[n] = '\0';
    printf( "Rcvd msg from server: %s", buffer );
  }
}

}

4

1 に答える 1

2

FD_スタッフは、さまざまな「イベント」の「待機」を並行して処理するためのファイル記述子のセットを保持するために使用されます。最初の「太字」ブロックは、2つのfd、標準入力とソケット(おそらく)でセットを初期化します。次に、「select」関数は、それらが読み取られる準備ができたときに、プログラムにそれらの「ファイル」を待機させます。そのうちの1つが準備できると、select関数が制御を戻しますが、どの「fd」が準備ができているかを知ることはできません。したがって、FD_ISSETを使用すると、それを認識し、ifの本体で状況を処理して、何かを実行できます(一方または両方を準備できます)。stdinを読み取る準備ができると、プログラムはstdinから読み取り、sockに書き込みます。sockを読み取る準備ができると、プログラムはsockから読み取り、読み取った内容をstdoutに書き込みます。

別の言い方をすれば、FD_スタッフはI/O多重化用です。

于 2012-04-11T06:47:29.890 に答える