加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

Windows C:如何重定向stderr以调用fprintf?

发布时间:2020-12-14 02:52:50 所属栏目:Windows 来源:网络整理
导读:我在我们自己的自定义包装器中包装来自BSD项目的现有C代码,我希望尽可能少地将它集成到我们的代码中.此代码使用fprintf打印到stderr以记录/报告错误. 我想将其重定向到同一进程中的替代位置.在Unix上我用套接字和线程完成了这个:套接字的一端是我发送stderr
我在我们自己的自定义包装器中包装来自BSD项目的现有C代码,我希望尽可能少地将它集成到我们的代码中.此代码使用fprintf打印到stderr以记录/报告错误.

我想将其重定向到同一进程中的替代位置.在Unix上我用套接字和线程完成了这个:套接字的一端是我发送stderr的地方(通过调用dup2),另一端是在一个线程中监视,然后我可以处理输出.

这在Windows上不起作用,因为套接字与文件句柄不同.

我在网上找到的所有文档都显示了如何重定向子进程的输出,这不是我想要的.如何在同一进程中重定向stderr,在写入输出时获得某种回调? (在你这样说之前,我已经尝试过SetStdHandle,但找不到任何办法让这项工作)……

解决方法

您可以在Windows上使用类似的技术,您只需要为相同的概念使用不同的单词. :)本文: http://msdn.microsoft.com/en-us/library/ms682499.aspx使用win32管道来处理来自另一个进程的I / O,你只需要对同一进程中的线程做同样的事情.当然,在您的情况下,从流程中的任何位置到stderr的所有输出都将重定向到您的消费者.

实际上,你可能需要的其他部分是_fdopen和_open_osfhandle.事实上,这是我多年前发布的code的一个相关例子:

DWORD CALLBACK DoDebugThread(void *)
{
    AllocConsole();
    SetConsoleTitle("Copilot Debugger");
    // The following is a really disgusting hack to make stdin and stdout attach
    // to the newly created console using the MSVC++ libraries. I hope other
    // operating systems don't need this kind of kludge.. :)
    stdout->_file = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE),_O_TEXT);
    stdin->_file  = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE),_O_TEXT);
    debug();
    stdout->_file = -1;
    stdin->_file  = -1;
    FreeConsole();
    CPU_run();
    return 0;
}

在这种情况下,主进程是一个GUI进程,它根本不以stdio句柄开头.它打开一个控制台,然后将右侧句柄推入stdout和stdin,这样debug()函数(设计为stdio交互式函数)可以与新创建的控制台进行交互.您应该能够打开一些管道并执行相同的操作来重定向stderr.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读