chenxiaohui318 发表于 2009-4-7 10:32:42

ACE_Message_Block有BUG?

以前没怎么用,这两天心血来潮试了一下,发现卷一的示例貌似有问题
ACE_Message_Block *head = new ACE_Message_Block(BUFSIZ);
ACE_Message_Block *mblk = head;
for(; ; )
{
ssize_t nbytes = ACE_OS::read_n(ACE_STDIN, mblk->wr_ptr(), mblk->size());
if(nbytes <= 0)
   break;
mblk->wr_ptr(nbytes);
mblk->cont(new ACE_Message_Block(BUFSIZ));
mblk = mblk->cont();
}
for(mblk = head; mblk != 0; mblk = mblk->cont())
ACE_OS::write_n(ACE_STDOUT, mblk->rd_ptr(), mblk->length());
head->release();

除了头文件包含错误之外,我输出BUFSIZ的大小时,是512,而Block输入完成后没有输出
于是我把BUFSIZ 自已DEFINE为10,发现输入大于10个字符时会有输出,小于时不会有输出
而且Ctrl+Z之前一行的输入输出不一致,请问这是为什么?

winston 发表于 2009-4-7 17:41:04

没搞明白你的问题。
这个程序就是展示ACE_Message_Block的控制能力而已。你自己定小了缓冲区,可能会越界了。

chenxiaohui318 发表于 2009-4-8 09:34:38

回复 #2 winston 的帖子

可是我使用默认的BUFSIZ(512)时,根本没东西打印出来呀

winston 发表于 2009-4-8 12:41:32

自己追踪一下。
ACE_OS::read_n(ACE_STDIN, mblk->wr_ptr(), mblk->size());

从标准输入读取。

chenxiaohui318 发表于 2009-4-9 16:25:38

回复 #4 winston 的帖子

我调试时发现
键盘输入时,每输完一行回车,程序并没有执行
mblk->wr_ptr(nbytes);
mblk->cont(new ACE_Message_Block(BUFSIZ));
mblk = mblk->cont();
所以根本就没有形成Block链,最后Ctrl+Z,就直接Break了
请问ACE_OS::read_n()函数怎么知道此次输入结束?好像回车不是的呀

winston 发表于 2009-4-9 17:44:55

ACE_OS::read_n()是读取到指定数量的信息后才返回啊。
页: [1]
查看完整版本: ACE_Message_Block有BUG?