ACE_OS :: read_n () возвращает 0, даже если некоторые данные получены

Я использую ACE_OS::read_n() читать некоторые данные из stdin (ACE_STDIN), Мой пример кода:

ACE_Message_Block *head = new ACE_Message_Block(BUFSIZ);
size_t bytes_trans = 0;
ssize_t nbytes = ACE_OS::read_n(
ACE_STDIN,
mblk->wr_ptr(),
mblk->size(),
&bytes_trans);

Если я начну свою программу с командой ./a.out <<< "hello", он находит EOF после данных и возвращает 0. Таким образом, я могу обнаружить данные, полученные только при проверке bytes_trans переменная.

Это правильно ACE_OS::read_n() поведение?

0

Решение

Просто посмотрел на Документация по ACE doxygen

Получить len байтов в buf из дескриптора (использует вызов, который использует системный вызов в UNIX и вызов в Win32). Если возникают ошибки, возвращается -1. Если происходит EOF, возвращается 0. Все прочитанные данные будут возвращены вызывающей стороне через bytes_transferred.

Рассмотрим реализацию (обратите внимание, что приведенный ниже код взят из ACE 5.6.7 … это источник, который мне пригодится)

ssize_t
ACE_OS::read_n (ACE_HANDLE handle,
void *buf,
size_t len,
size_t *bt)
{
size_t temp;
size_t &bytes_transferred = bt == 0 ? temp : *bt;
ssize_t n = 0;

for (bytes_transferred = 0;
bytes_transferred < len;
bytes_transferred += n)
{
n = ACE_OS::read (handle,
(char *) buf + bytes_transferred,
len - bytes_transferred);

if (n == -1 || n == 0)
{
return n;
}
}

return ACE_Utils::truncate_cast<ssize_t> (bytes_transferred);
}

Таким образом, кажется, что он вызывает несколько раз ACE_OS::read() накапливая полученные байты в bytes_transferred

Если все идет хорошо, возвращаемое значение будет таким же, как содержимое bytes_transferred
Если read() возвращает 0 или -1, read_n() вернет 0 или -1, а bytes_transferred content будет количеством прочитанных байтов.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector