/** 这个程序作用: 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; };