gpt4 book ai didi

c++ - select() 和 FD_ISSET() 成功后 read() 失败

转载 作者:太空宇宙 更新时间:2023-11-04 04:54:51 46 4
gpt4 key购买 nike

在 Linux 环境中,我有一个应用程序,它通过对驱动程序的 API 调用获取文件描述符。以下函数是我用来读取系统上的卡读取的数据的函数。大约十分之一的读取失败。我很困惑为什么在成功选择并检查read_fd是否设置后,没有返回任何数据。

int MyClass::Read(int file_descriptor)
{
unsigned short read_buffer[READ_BUFFER_SIZE];
fd_set read_set;
time_val timeout;
int return_value = 0;
int count = 0;
int status = -1;

// Initialize read file descriptor
FD_ZERO(&read_set)

// Add driver file descriptor
FD_SET(file_descriptor, &read_set)

// Set timeout
timeout.tv_sec = 0;
timeout.tv_usec = 10000;

while(!count)
{
// Wait for data to be available to read
return_value = select(file_descriptor + 1, &read_set, NULL, NULL, &timeout);

// Make sure an error or a timeout didn't occur
if (-1 == return_value)
{
cout << "an error occurred" << endl;
}
else if (0 == return_value)
{
cout << "a timeout occurred" << endl;
}
else
{
// If the read file descriptor is set, read in the data
if (FD_ISSET(file_descriptor, &read_set))
{
count = read(file_descriptor, read_buffer, sizeof(read_buffer));

// Double check that data was read in
if (!count)
{
cout << "read failed" << endl;
}
else
{
// Set status to success
status = 0;
}
}
}
}

return status;
}

最佳答案

读取返回值 0(您的 if (!count) 检查)并不意味着读取失败 - 它意味着读取成功并获得了 EOF。

无论如何,select 返回文件描述符集并不意味着对该 fd 的读取不会失败——它意味着对该 fd 的读取不会阻塞,并且会立即返回一些内容,无论是失败还是成功。

关于c++ - select() 和 FD_ISSET() 成功后 read() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49907708/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com