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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Windows Containers 大冒险: 优化计划(Dockerfile)
- Windows系统命令行NET LOCALGROUP命令 新增 删除更新 用户组
- windows-server-2008 – 由数以千计建立的NTUSER.DAT和UsrC
- windows-server-2008 – Windows系统管理员,要知道的事情?
- HM NIS Edit打包Electron应用的注意事项
- windows – 批处理 – 无法打印字符串开头的空格
- windows下如何为jdk配置环境变量
- Windows下Kettle定时任务执行并发送错误信息邮件
- windows – WaitForMultipleObjects()是否重置所有自动重置
- windows-server-2008-r2 – DHCP服务器只记住一个租约