【发布时间】:2013-12-27 19:20:01
【问题描述】:
我遇到了奇怪的问题,每次都选择返回 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,并打印“可写入的数据”。 我哪里错了?
【问题讨论】:
-
您期望什么?如果只选择常规文件,您认为
select何时应返回 0? -
我已经使用 select 和 socket,但不确定我是否可以将它用于常规文件?我主要担心的是,由于我没有写信给 fd,它仍然会打印“可供读取的数据”。请帮忙。
-
@n.m.
select表明这一点非常有用,例如读取网络安装的常规文件会阻塞。 -
@user4815162342 即使在
select时缓冲区缓存中的数据可用,也不能保证在返回select和调用read。操作系统中的选择是始终返回“不可读”或“可读”。由于许多程序在标准输入上选择(在正常情况下处理 tty)并且当标准输入是文件时会中断,因此只有“可读”是一个明智的选择。此外,select 并不能保证您不会阻塞(想想锁),只能保证您不会无限期地阻塞。 -
抱歉,误读了您的评论。不,
select不适用于网络安装的文件。它们始终被视为可用。