C语言 Select在输入文件中总是返回0



Select总是在输入文件中返回0

我写了一个函数函数,接收FILE*并检查它是否准备好了。

函数:

int ioManager_nextReady(FILE *IFILE) {
// Setting input ifle
int inDescrp = fileno(IFILE ? IFILE : stdin);
// Setting timer to 0
struct timeval timeout;
timeout.tv_sec = timeout.tv_usec = 0;
// Variables for select
unsigned short int nfds = 1;
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(inDescrp, &readfds);
// Run select
int nReady = select(nfds, &readfds, NULL, NULL, &timeout);
if (nReady > 0) {
return inDescrp;
}
return -1;
}

我正在尝试用check.h测试这个函数。

测试:

static FILE *tmpIn;
void before(char *line) {
tmpIn = tmpfile();
if (line) {
fprintf(tmpIn, "%sn", line);
rewind(tmpIn);
fflush(tmpIn);
}
}
void after() { fclose(tmpIn); }
START_TEST(test_ioManager_nextReady_NULL) {
before(NULL);
int data;
data = ioManager_nextReady(tmpIn);
ck_assert_int_eq(data, -1);
after();
}
END_TEST
#define LINEIN "Sample input"
START_TEST(test_ioManager_nextReady_text) {
before(LINEIN);
int data;
data = ioManager_nextReady(tmpIn);
ck_assert_int_ne(data, -1);
after();
}
END_TEST
结果:

Running suite(s): IOManager
50%: Checks: 2, Failures: 1, Errors: 0
ioManager.test.c:42:F:Smoke:test_ioManager_nextReady_text:0: Assertion 'data != -1' failed: data == -1, -1 == -1

在我使用rewindfflush之后,选择返回0

当我使用read我可以检索数据。

// Debug
char bff[MAXLINE];
int n = read(inDescrp, bff, MAXLINE);
bff[n] = '';
printf("%dn", inDescrp);
printf("%sn", bff);

所以选择返回0,即使我可以读取数据。

如果我尝试设置非零超时,问题也会继续。

为什么会发生这种情况?

我需要检查一个文件是否可以被读取。

可能的解决方案是什么?

我知道你为什么被'nfds'参数引入歧途,选择()。它读起来和听起来都像"文件描述符的数量"。

不是那样的。它应该是你关心的最高文件描述符的值,加上1。参见(例如)Linux手册

顺便说一下,nfds形参是int型,所以不要使用unsigned short型。它会"正常工作"。一般来说,but非常令人困惑。

最新更新