【问题标题】:WriteFile function with assembly debugging (syncing)带汇编调试(同步)的 WriteFile 函数
【发布时间】:2014-07-11 18:30:25
【问题描述】:

首先,这个问题是基于我在这里的最后一个问题:Reading Console Buffer / Output C++

我有一个已编译的可执行二进制文件。它有一些输出,我想将它重定向到另一个处理这些行的程序。我成功找到了输出的发送位置,并将其修改为STDOUT。问题是,当我像这样使用它时:

./jampDed.exe | stdout.exe

然后输出不同步。我每 1000-2000 个字节获取一次内容。

stdout.cpp

#include <iostream>

int main() {
    std::string s;
    while (std::getline(std::cin, s, '\n')) {
        std::cout << s << std::endl;
    }

    return 0;
}

我还画了一张关于程序集修改的图,里面默认使用了Kernel32.WriteFile函数。

所以问题是,我怎样才能让它同步?如何在专用服务器上立即获取每一行?

【问题讨论】:

    标签: c++ assembly kernel32


    【解决方案1】:

    在可执行文件中建立stdout 的某处是无缓冲输出的选项位。只需设置(或清除)该位。然后,每个 write 调用都会立即传输。这会为该程序增加大量的执行时间和 i/o 系统工作量,但这可能还可以。

    处理该输出(作为输入)的程序应该缓冲整行,因为程序本身不太可能进行整行输出。

    【讨论】:

    • 谢谢,我会试试的。 :) 但首先我会尝试使用 ReadConsoleOutput,因为在父控制台中它是同步的,只有管道使它不同步
    • 你是对的!没有一点,但是在调试的时候发现WriteFile前面有一个跳转2个函数。花了大约一个小时,但现在效果很棒! :) 谢谢!我真的认为 PIPE 让它以某种方式不同步^^
    【解决方案2】:

    你为什么不试试:

    std::cout << s << std::endl << std::flush;
                                   ^^^^^^^^^^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多