在嵌入式开发中,调用 select 函数出现 No such file or directory
错误,测试程序如下:
#include
#include
#include
#include
#include
#define TEST_MODE 0
#define BUF_SIZE 1024
// #define TEST_DEV "/dev/test_dev" /* 标准输入设备节点 */
#define TEST_DEV "/dev/stdin" /* 标准输入设备节点 */
int main(int argc, char *argv[])
{
int fd;
fd_set reads;
int result;
int str_len;
char buf[BUF_SIZE];
struct timeval timeout;
while(1)
{
FD_ZERO(&reads);
fd = open(TEST_DEV, O_RDWR);
if (fd < 0)
{
sleep(1);
continue;
}
FD_SET(fd, &reads);
#if TEST_MODE > 0
timeout.tv_sec = 0;
timeout.tv_usec = 2000 * 1000; /* 大于1s时,出现 No such file or directory错误 */
#else
timeout.tv_sec = 2;
timeout.tv_usec = 0; /* 不会出现问题 */
#endif
result = select(fd + 1, &reads, NULL, NULL, &timeout);
if (result == -1)
{
perror("select error");
continue;
}
else if (result == 0)
{
printf("timeout\n");
continue;
}
if (FD_ISSET(fd, &reads))
{
str_len = read(fd, buf, BUF_SIZE);
buf[str_len] = 0;
printf("message: %s", buf);
}
}
return 0;
}
项目中,实际使用的是特定的设备节点,当 select 函数的最后一个参数 tv_usec 设置超过1s时,就会出现 No such file or directory 错误。
但是使用标准输入测试时,不会出现该问题,并且 select 的超时也是准确的,故该问题应该是由于操作的设备节点内部处理出现了问题。