标签: stdout

在Delphi控制台应用程序中打开stdin/stdout上的TStream

我正在尝试编写一个Delphi控制台应用程序,为其标准输入创建一个TStream,为其标准输出创建另一个TStream.

(它将由主机应用程序启动,其输入和输出重定向到管道,并将二进制数据传入/传出该主机应用程序,因此TStream将比ReadLn/WriteLn更适合于该任务.)

如何在标准输入或标准输出上打开TStream?

delphi stdin stdout console-application tstream

28
推荐指数
1
解决办法
5680
查看次数

将cout和stdout重定向到C++中用于单元测试的字符串

我正在努力在单元测试下获取一些遗留代码,有时感知现有程序行为的唯一方法是从控制台输出.

我在网上看到很多关于如何将stdout重定向到C++中的另一个文件的例子,但有没有办法可以将它重定向到内存中的流,这样我的测试就不必依赖磁盘了?

我希望将遗留代码发送到stdout的任何内容转换为std :: string,这样我就可以轻松地查找输出.

编辑

遗留代码是如此糟糕,以至于用户混合使用cout << ..printf.这是我到目前为止:

void TestSuite::setUp(void)
{
    oldStdoutBuf = std::cout.rdbuf();
    std::cout.rdbuf(consoleOutput.rdbuf());
}
void TestSuite::tearDown(void)
{
    std::cout.rdbuf(oldStdoutBuf);
}
Run Code Online (Sandbox Code Playgroud)

问题是,这并没有用printf捕捉输出.我想要两件兼得的东西.有任何想法吗?

c++ unit-testing stdout legacy-code

28
推荐指数
1
解决办法
2万
查看次数

将stdout重定向到Java中的字符串

我知道如何将stdout重定向到文件,但我不知道如何将它重定向到字符串.

java stdout

28
推荐指数
1
解决办法
2万
查看次数

Python多处理:如何从子进程可靠地重定向stdout?

NB.我已经看到了multiprocessing.Process的日志输出 - 遗憾的是,它没有回答这个问题.

我正在通过多处理创建一个子进程(在Windows上).我希望将所有子进程的stdout和stderr输出重定向到日志文件,而不是出现在控制台上.我看到的唯一建议是子进程将sys.stdout设置为文件.但是,由于Windows上的stdout重定向行为,这不能有效地重定向所有stdout输出.

要说明此问题,请使用以下代码构建Windows DLL

#include <iostream>

extern "C"
{
    __declspec(dllexport) void writeToStdOut()
    {
        std::cout << "Writing to STDOUT from test DLL" << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后创建并运行如下所示的python脚本,它导入此DLL并调用该函数:

from ctypes import *
import sys

print
print "Writing to STDOUT from python, before redirect"
print
sys.stdout = open("stdout_redirect_log.txt", "w")
print "Writing to STDOUT from python, after redirect"

testdll = CDLL("Release/stdout_test.dll")
testdll.writeToStdOut()
Run Code Online (Sandbox Code Playgroud)

为了看到与我相同的行为,可能需要针对与Python使用的不同的C运行时构建DLL.在我的例子中,python是使用Visual Studio 2010构建的,但我的DLL是使用VS 2005构建的.

我看到的行为是控制台显示:

> stdout_test.py

Writing to STDOUT from python, before redirect

Writing to STDOUT …
Run Code Online (Sandbox Code Playgroud)

python windows stdout multiprocessing stderr

28
推荐指数
1
解决办法
1万
查看次数

为什么stdout在重定向到文件时需要显式刷新?

行为printf()似乎取决于的位置stdout.

  1. 如果stdout发送到控制台,则printf()行缓冲并在打印换行符后刷新.
  2. 如果stdout被重定向到文件,则除非fflush()被调用,否则不刷新缓冲区.
  3. 此外,如果printf()stdout重定向到文件之前使用,则后续写入(对文件)是行缓冲的并在换行后刷新.

何时进行stdout行缓冲,什么时候fflush()需要调用?

最简单的例子:

void RedirectStdout2File(const char* log_path) {
    int fd = open(log_path, O_RDWR|O_APPEND|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO);
    dup2(fd,STDOUT_FILENO);
    if (fd != STDOUT_FILENO) close(fd);
}

int main_1(int argc, char* argv[]) {
    /* Case 1: stdout is line-buffered when run from console */
    printf("No redirect; printed immediately\n");
    sleep(10);
}

int main_2a(int argc, char* argv[]) {
    /* Case 2a: stdout is not line-buffered when …
Run Code Online (Sandbox Code Playgroud)

c linux stdout

28
推荐指数
1
解决办法
1万
查看次数

如何为每个应用程序配置tomcat 6的logs/catalina.out.(为sys.out,sys.err配置特定于Web应用程序的日志文件)

要求是......

我们在RHEL-5服务器中部署了3个Web应用程序,我们使用tomcat 6.0.16部署了应用程序.我们想配置stdout,stderr,它们在应用程序特定的日志文件中进入tomcat/logs/catalina.out,如,

tomcat/logs/app1.log tomcat/logs/app2.log tomcat/logs/app3.log

我们正在使用log4j,但它只生成我们需要stdout per-app的日志记录详细信息,它将在tomcat/logs/catalina.out中出现

任何帮助赞赏......

logging tomcat log4j stdout

27
推荐指数
1
解决办法
5万
查看次数

什么是Ruby中的"sys.stdout.write()"等价物?

如Python所示,sys.stdout.write()Ruby中的等价物是什么?

ruby python stdout

27
推荐指数
3
解决办法
2万
查看次数

Fortran 90中的标准输入和输出单元?

如何读取和写入标准输入,输出和错误流stdin,stdout以及stderr在Fortran中?我听说写stderr,例如,使用write(5, fmt=...)5单位的stderr,我知道写的方式stdout是使用write(*, fmt=...).

如何使用ifort编译器读取和写入标准输入和输出单元?

编译器版本:

英特尔(R)Fortran编译器,用于运行在英特尔(R)64,版本10.0 Build 20070426上的应用程序包ID:l_fc_p_10.0.023版权所有(C)1985-2007英特尔公司.版权所有

stdin fortran stdout stderr fortran90

27
推荐指数
3
解决办法
2万
查看次数

我应该向STDERR或STDOUT输出警告吗?

我正在创建一个处理预定义数据集的脚本,输出到文件.我想在一个数据(在我有权访问的每个集合中始终为"常规")不同时声明该值未处理(因为我不知道它如何影响数据)时弹出警告.我应该将此警告输出到stderr或stdout吗?

warnings stdout stderr

26
推荐指数
2
解决办法
5366
查看次数

printf减慢了我的程序

我有一个小的C程序来计算哈希值(哈希表).我希望代码看起来很干净,但有一些与它无关的东西让我烦恼.

我可以在大约0.2-0.3秒内轻松生成大约一百万个哈希值(以/ usr/bin/time为基准).但是,当我在forf循环中使用printf()时,程序会减慢到大约5秒钟.

  1. 为什么是这样?
  2. 如何让它更快?mmapp()ing stdout也许?
  3. stdlibc是如何设计的,以及如何改进?
  4. 内核怎么能更好地支持它?如何修改本地"文件"(套接字,管道等)的吞吐量真的很快?

我期待着有趣而详细的回复.谢谢.

PS:这是一个编译器构造工具集,所以不要害羞进入细节.虽然这与问题本身无关,但我只想指出细节让我感兴趣.

附录

我正在寻找更多解决方案和解释的程序方法.确实,管道工作起了作用,但我无法控制"用户"的作用.

当然,我现在正在进行测试,"普通用户"不会这样做.但这并没有改变一个简单的printf()减慢一个进程的事实,这是我试图找到一个最佳的编程解决方案的问题.


附录 - 惊人的结果

参考时间用于TTY内的普通printf()调用,大约需要4分钟20秒.

在/ dev/pts(例如Konsole)下进行测试可将输出速度提高到约5秒.

在我的测试代码中使用setbuffer()大小为16384时需要大约相同的时间,对于8192几乎相同:大约6秒.

setbuffer()在使用时显然没有效果:它需要相同的时间(在TTY上大约4分钟,在PTS上大约5秒).

令人惊讶的是,如果我在TTY1上开始测试然后切换到另一个TTY,它确实需要与PTS相同:大约5秒.

结论:内核做了一些与可访问性和用户友好性有关的事情.呵呵!

通常情况下,无论你是在活动时盯着TTY还是切换到另一个TTY,它都应该同样慢.


课程:运行输出密集型程序时,切换到另一个TTY!

c performance glibc stdout linux-kernel

26
推荐指数
5
解决办法
1万
查看次数