В большинстве случаев этот код работает просто отлично.Но иногда, когда исполняемый файл некоторое время выполнялся, select (), по-видимому, немедленно истекает, а затем попадает в странное состояние, в котором он продолжает вызываться, время истекает немедленно, снова и снова.Тогда это должно быть убито снаружи.
Я полагаю, что ошибка, связанная с изменением стандартного входа во времени, - это то, что блокирует выбор.
Оглядываясь на StackOverflow, большинство проблем людей с select (), похоже, решаются путем сброса каждого макроса (FD_ZERO & FD_SET) каждый раз и использования правильного исходного параметра для выбора.Я не думаю, что это проблемы здесь.
int rc = 0;
fd_set fdset;
struct timeval timeout;
// -- clear out the response -- //
readValue = "";
// -- set the timeout -- //
timeout.tv_sec = passedInTimeout; // 5 seconds
timeout.tv_usec = 0;
// -- indicate which file descriptors to select from -- //
FD_ZERO(&fdset);
FD_SET(passedInFileDescriptor, &fdset); //passedInFileDescriptor = 0
// -- perform the selection operation, with timeout -- //
rc = select(1, &fdset, NULL, NULL, &timeout);
if (rc == -1) // -- select failed -- //
{
result = TR_ERROR;
}
else if (rc == 0) // -- select timed out -- //
{
result = TR_TIMEDOUT;
}
else
{
if (FD_ISSET(mFileDescriptor, &fdset))
{
if(rc = readData(readValue) <= 0)
{
result = TR_ERROR;
}
} else {
result = TR_SUCCESS;
}
}