select() 调用常规文本文件的文件描述符

问题描述 投票:0回答:1

我遇到奇怪的问题,每次都选择返回1值。

下面是我的代码:

代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

static int fd;

void *testThread(void* arg)
{
    fd_set set;
    struct timeval tv;
    int test = -1;

    char buf[8]={0};
    int ret = -1;

    while(1)
    {
        FD_ZERO(&set);
        FD_SET(fd,&set);

        /* Wait up to five seconds. */
        tv.tv_sec = 5;
        tv.tv_usec = 0;

        printf("waiting..\n");
        test = select(fd+1,&set,NULL,NULL,&tv); //FD_SETSIZE
        printf("Value of test = %d\n",test);
        perror("select:");

        if(test == 0)
            printf("No data available to read for last 5 sec.\n");
        else if(test < 0)
            printf("select() failed\n");
        else if(test > 0)
        {
            printf("data available to read\n");
            ret = read(fd,buf,sizeof(buf));
            printf("ret = %d\n",ret);
            printf("%s\n",buf);
            sleep(1);
        }

    }
}

int main()
{
    pthread_t id;
    int ret = -1;
    //FILE *fp = tmpfile();
    char *buf="Hello";
    fd = open("test.txt", O_CREAT |O_RDWR |  O_NDELAY);

    if(0 > fd)
    {
        perror("Failed to open tmp file\n");
        exit(-1);
    }

    printf("Fd %d\n",fd);

    pthread_create(&id,NULL,testThread,(void*)0);
    sleep(5);

    printf("Inside main\n");

    //ret = write(fd,buf,4);
    //printf("value of ret %d\n",ret);
    sleep(20);
    close(fd);

    return 0;
}

在这段代码中,我面临着奇怪的行为(可能是我在某些地方错了),当我没有写入fd时,仍然选择返回1,并打印“可写入的数据”。 我哪里错了?

c unix file-io posix-select
1个回答
1
投票

不幸的是,

select
在常规文件上并不像你希望的那样工作——它们总是被认为是可读的,即使在现实块中读取它们,就像远程安装分区的情况一样。这同样适用于
poll
和等效的多路复用器。

对任意文件执行非阻塞读取的唯一可移植方法是在单独的线程中执行此操作。另一种方法是使用 AIO,但代价是额外的复杂性

© www.soinside.com 2019 - 2024. All rights reserved.