即使收到一些数据,ACE_OS :: read_n()也会返回0

时间:2014-04-02 09:12:40

标签: c++ ace

我使用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()行为是否正确?

1 个答案:

答案 0 :(得分:1)

只看ACE doxygen documentation

  

从句柄接收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内容将是到目前为止读取的字节数。