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

时间:2013-12-10 10:17:03

标签: c unix select file-io

我面临奇怪的问题,每次都选择返回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,并打印“可写入的数据”。 我哪里错了?

1 个答案:

答案 0 :(得分:1)

不幸的是,常规文件上的select无法按照您希望的方式运行 - 即使在实际块中读取它们也始终被认为是可读的,远程安装分区的情况也是如此。这同样适用于poll和等效的多路复用器。

对任意文件执行非阻塞读取的唯一可移植方法是在单独的线程中执行此操作。另一种方法是使用AIO,费用为additional complexity