1

select()stdinからデータを受信するために使用します。

コードはここにあります:

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
int main()
{
    fd_set rfds;
    struct timeval tv;
    int retval;
    char buf[100];

    FD_ZERO(&rfds);
    FD_SET(STDIN_FILENO, &rfds);

    tv.tv_sec = 5;
    tv.tv_usec = 0;

    retval = select(1,&rfds,0,0,&tv);

    if( retval == -1)
        perror("select reset\n");
    else if(retval == 0)
        printf("timeout\n");
    else
    {
        printf("data available\n");
        if(FD_ISSET(STDIN_FILENO, &rfds))
        {
           //int ret = recv(STDIN_FILENO, buf, sizeof(buf), 0); // ret get -1.
           int ret = read(STDIN_FILENO, buf, sizeof(buf));       // ret get correct data. 
           printf("buf: %s ret: %d\n", buf,ret);            
        }
    }    
    return 0;
}

このコードでは、recv()は常にを返します-1read()、正しいデータを取得できます。

これは、パラメータが。のread()場合と同等であることがわかります。それでは、なぜ私のコードの動作は同じではないのですか?recv()flags0recv()read()

4

2 に答える 2

1

はソケットで使用するためrecv()のものであり、stdinのような一般的なファイル記述子ではありません。ソケットは他の記述子と同じように扱うことができますが、記述子の背後に必ずしもソケットがあるとは限りません(stdinの場合はそうではありません)。

その特定のコードでは、チェックerrnoすると、の値EINVALまたは類似の値になると思います。

于 2011-08-01T02:35:36.590 に答える
0

マニュアルページをチェックしてください: ssize_t recv(int sockfd, void *buf, size_t len, int flags);

于 2012-02-28T07:47:45.740 に答える