草庐IT

c++ - 选择子进程继承哪些句柄

coder 2023-11-10 原文

当使用 Windows API 在 C++ 中创建子进程时,可以允许从父进程到子进程的句柄继承。在 Microsoft 示例中 "Creating a Child Process with Redirected Input and Output" ,将子进程的标准输入/输出重定向到父进程创建的管道,必须允许继承才能使用重定向管道。

我正在开发一个小型演示类,它启动一个外部可执行文件,读取输出,然后将其返回给调用者(调用者将返回的输出记录到一个文件中)。我正在尝试构建一个超时功能,它只会在对 child 调用 TerminateProcess() 并继续生活之前阻塞一定的时间。

但是,我发现通过允许句柄继承,子进程也有输出文件的句柄(通过 Process Explorer 可见)。我不希望子进程获得此句柄,但在这种情况下(此演示类)的父进程也不知道该句柄,因此我目前无法使用 SetHandleInformation() 取消标记输出文件专门将其从继承中排除。

我确信必须有更好的方法继承我想要的特定句柄,而不允许传递意外和不需要的句柄的“一揽子”继承。不幸的是,我一直无法找到解决方案,浏览了尽可能多的相关 MSDN 文章,并在谷歌上搜索自己,陷入了沮丧的状态。

至少,我需要做一些事情来从 child 身上移除句柄,而不必在演示类中拥有这些句柄(它们被调用类使用,而这个演示类没有明确知道它们的存在)。

有更多选择性继承的解决方案吗?我对允许我明确声明要继承的句柄的解决方案特别感兴趣,如果存在这样的解决方案,则不会继承所有未指定的句柄。

谢谢你。

最佳答案

如果输出文件句柄被子进程继承,那是因为父进程中打开文件的代码明确声明了文件句柄应该是可继承的。它为 CreateFilelpSecurityAttributes 参数传递了一个值。 .默认状态是句柄不可可继承。

在我看来,您的进程创建类不应该尝试猜测已经打开文件的调用者。

但是,如果您特别了解新进程需要哪些句柄,那么在 Windows Vista 中,有一种机制可以指定应继承哪些句柄。当您准备调用 CreateProcess 时,请使用 STARTUPINFOEX 结构而不是通常的 STARTUPINFO。它有一个 lpAttributeList 成员。分配并初始化它,然后使用UpdateProcThreadAttribute使用 PROC_THREAD_ATTRIBUTE_HANDLE_LIST 设置要继承的句柄列表。所有的句柄都需要是可继承的,调用CreateProcess时仍然需要指定bInheritHandles = TRUE。您还需要在 dwCreationFlags 参数中包含 EXTENDED_STARTUPINFO_PRESENTRaymond Chen demonstrated the technique in an article in 2011.

如果您无法使用该附加功能,那么您当然可以尝试 enumerate all your program's open handles并使用 SetHandleInformation 设置它们的所有继承属性,但这似乎超出了其工作是创建子进程的功能的范围。让创建句柄的代码担心它们是否应该是可继承的。

关于c++ - 选择子进程继承哪些句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2344887/

有关c++ - 选择子进程继承哪些句柄的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  3. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  4. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

  5. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  6. ruby-on-rails - Rails 单表继承 : How to override the value written to the type field - 2

    在我的系统中,我已经定义了STI。Dog继承自Animal,在animals表中有一个type列,其值为"Dog"。现在我想让SpecialDog继承自dog,只是为了在某些特殊情况下稍微修改一下行为。数据还是一样。我需要通过SpecialDog运行的所有查询,以返回数据库中类型为Dog的值。我的问题是因为我有一个type列,rails将WHERE"animals"."type"IN('SpecialDog')附加到我的查询中,所以我不能获取原始的Dog条目。所以我想要的是以某种方式覆盖rails在通过SpecialDog访问数据库时使用的值,使其表现得像Dog。有没有办法覆盖用于类型

  7. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  8. ruby-on-rails - 您希望看到哪些 Rails 插件? - 2

    您认为可以作为插件很好地存在于您的Rails应用程序中必须实现的哪些行为?您过去曾搜索过哪些插件功能但找不到?哪些现有的Rails插件可以改进或扩展,如何改进或扩展? 最佳答案 我希望在管理界面中看到一个引擎插件,它提供了应用程序中所有模型的仪表板摘要,以及可配置的事件图表。 关于ruby-on-rails-您希望看到哪些Rails插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio

  9. ruby - 无法在 Ruby 中将 ffmpeg 作为子进程运行 - 2

    我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope

  10. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

随机推荐