我使用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 :(得分:1)
从句柄接收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
内容将是到目前为止读取的字节数。