2011-03-04 43 views
1

此问题可能与Emacs无关,但与所有使用Console进行调试过程的开发环境无关。这是问题。我使用Eshell来运行我们正在开发的应用程序。这是一个J2ME应用程序。而对于调试,我们只使用System.out.println()。现在,假设我只允许在控制台中显示以Eko:开头的文本(交互式),有可能吗?如何仅允许在Emacs控制台上打印某些文本?

我在我的Windows环境下安装了Cygwin,并尝试grep这样的输出: run | grep Eko:。它确实只以Eko:作为开始,过滤输出,但它不是交互式的。输出压缩,直到应用程序退出。那么,无论如何,这是无用的。

是否可以做到这一点?我的意思是,我们不必触摸应用程序代码本身?

我也标记到Linux,因为也许Linux中的一些人知道答案。

非常感谢!

回答

1

简而言之:尝试将--line-buffered添加到您的grep命令中。

长:我假设你的应用程序正在刷新其输出流,每System.out.println(),而grep有可用线路立即读取,但选择缓冲输出,直到它有足够的输出保存起来,使写作合理。 (这通常是4k或8k的数据,可能是几百行,具体取决于你的行长度。)

当输出是管道中的另一个程序时,这种缓冲很有意义;减少不必要的上下文切换是提高程序吞吐量的好方法。

但是,如果您的打印速度足够慢,导致其不能足够快速地为“实时”输出填充缓冲区,则切换到行缓冲输出可能会修复该问题。

+0

非常好! 还有一个非常详细的解释... 非常感谢。这在这里会帮助我们很多。谢谢 – swdev 2011-03-04 04:19:52

+0

顺便说一句,我只是在DOS命令窗口中测试没有'-line-buffered'的'grep'。有用。那么,为什么我们需要在Emacs Shell中使用'--line-buffered',而不是在DOS命令窗口中?我很抱歉,如果在你的解释中你已经解释了它。我只是有时间去了解它:) 非常感谢 – swdev 2011-03-04 04:32:07

+1

@swdev:以终端作为输出,标准C库将'stdout' stdio流设置为行缓冲。但是,当'stdout'流设置为管道(因为我想它是在Emacs缓冲区中),那么C库将执行块缓冲。默认是在文件描述符上调用'fstat(2)',并为缓冲区使用'st_blksize'字节。这通常是4k或8k,但其他值也是可能的。 'setvbuf(3)'手册页包含所有细节。 :) – sarnold 2011-03-04 04:37:35