Я использую 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()
поведение?
Просто посмотрел на Документация по 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 будет количеством прочитанных байтов.
Других решений пока нет …