1. ホーム
  2. c

[解決済み] FD_ISSETの仕組みは?

2022-02-12 08:04:36

質問事項

FD_ISSETは、ソケットがセットに入っているかどうかをチェックするとマニュアルに書いてあります。ということは if (FD_ISSET(STDIN, &readfds)) stdinがセットされていればすぐにプリントアウトされるはずですが、実際には私がエンターキーを押すまで待たされます。何が足りないのでしょうか? すでに設定されている を呼び出したとき、プログラムは FD_SET(STDIN, &readfds) ?

Enterキーではなく、他の文字を入力すると、command not foundと表示されるのはなぜですか?例えば、fgetsをするとき、他の文字と同じように扱われると思っていたのですが。

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

#define STDIN 0  // file descriptor for standard input

int main(void)
{
    struct timeval tv;
    fd_set readfds;

    tv.tv_sec = 2;
    tv.tv_usec = 500000;

    FD_ZERO(&readfds);
    FD_SET(STDIN, &readfds);

    // don't care about writefds and exceptfds:
    select(STDIN+1, &readfds, NULL, NULL, &tv);

    if (FD_ISSET(STDIN, &readfds))
        printf("A key was pressed!\n");
    else
        printf("Timed out.\n");

    return 0;
}

解決方法は?

セレクトは、エンターまたはタイムアウトを待ちます。 FD_ISSETがエンターを待っているように感じるのは セレクトがタイムアウトした。

retvalを確認するとよりよく理解できます。

struct timeval tv; 
fd_set readfds;
int retval;

tv.tv_sec = 2;
tv.tv_usec = 500000;

FD_ZERO(&readfds);
FD_SET(STDIN, &readfds);

// don't care about writefds and exceptfds:
printf ("before select \n" );
retval = select(STDIN+1, &readfds, NULL, NULL, &tv);
printf ("after select \n" );

if (retval == -1) 
    perror("select()");
else if (retval > 0)
{
    //if (FD_ISSET(STDIN, &readfds));
        printf("Data is available now.\n");
}   
else
    printf("No data . timedout \n");