/**
这个程序作用:
1.把所有的数据从标准输入读入到一个动态分配的ACE_Message_Black的单向链表中
2.这些ACE_Message_Black通过它们的后续指针连接在一起
3.所ACE_Message_Black链表中的所有连接的消息块打印到标准输出设备上
4.释放1中动态分配的内存
*/
#include "ace/ACE.h"
#include "ace/Message_Block.h"
int main(int argc, char* argv[])
{
ACE_Message_Block* head = new ACE_Message_Block(BUFSIZ); // 头指针
ACE_Message_Block* mblk = head; // mblk 即: message block
for (size_t recvd = -1; ; recvd = -1)
{
/**
ACE::read_n()
@功能: 会试图读取buf长度的数据;
@retrun: 如果遇到文件结束(EOF)或者错误则返回 0 或 -1,如果先到达了buf长度则返回数据区长度
@param4 记录了实际读取的数据长度.
@mark
这里的mblk->size() = BUFSIZ = 512,
如果( 你的输入字节 < mblk->size() && read_n != EOF && read_n != 0 )
则read_n函数处于等待状态,不会执行下一条语句
*/
ssize_t nbytes = ACE::read_n(ACE_STDIN, mblk->wr_ptr(), mblk->size(), &recvd);
// 把写指针推进到缓冲区的末端
mblk->wr_ptr(recvd);
// 如果遇到EOF或错误,则退出循环
if (nbytes <= 0) break;
// 分配消息块并把它存放在链表的尾部
mblk->cont(new ACE_Message_Block(BUFSIZ));
mblk = mblk->cont();
}
// 把链表中的内空打印到标准输出上
/**
以下for循环可以用:
ACE::write_n(ACE_STDOUT, head);
代替;
该方法使用了一个高效的集中写操作把通过消息块的cont()指针连接在一起的所有消息块打印出来
*/
for (mblk = head; mblk != 0; mblk = mblk->cont())
{
ACE::write_n(ACE_STDOUT, mblk->rd_ptr(), mblk->length());
}
// 释放链表中的所有内存
head->release();
return 0;
};