我正在尝试通过 Windows 中的匿名管道从子进程接收数据。我知道如何使用标准 I/O 流来执行此操作,但这些被用于其他目的。我也知道如何在 Linux 或 OSX 中使用 fork()、pipe() 和 execv() 执行此操作。
在 Windows 中,您可以使用 CreatePipe() 创建管道,并使用 SetHandleInformation() 使一端不可继承。然后,对于 stdout 和 stderr,您可以将 STARTUPINFO 和 hStdOutput 或 hStdError 设置为 CreateProcess() 以传递另一端给 child 。在调用 CreateProcess() 之后,父级最接近它的是子级管道末端的句柄。 Creating a Child Process with Redirected Input and Output 中对此进行了详细说明。在 MSDN 上。但是,除了通过 stderr、stdout 或 stdin 之外,我还没有找到将 HANDLE 传递给 child 的方法。
我试过将 HANDLE 转换为类似这样的字符串:
std::ostringstream str;
str << hex << "0x" << handle;
std::string handleArg = str.str();
然后将其作为命令行参数传递并将其转换回HANDLE,这只是子进程中的void *。尽 pipe 进程显然继承了管道 HANDLE,但 HANDLE 的实际值必须与父进程中的不同,因为以这种方式传递它是行不通的。
我知道我可以使用命名管道来执行此操作,但似乎可以使用匿名管道来执行此操作。
那么在 Windows 中如何将管道 HANDLE 传递给子进程?
Update1: this MSDN article 中的示例代码似乎表明,至少对于套接字句柄,您可以将它们作为字符串传递给 child 。
更新 2:原来我犯了一个错误。请参阅下面我的回答。
最佳答案
事实证明,您可以将 HANDLE 作为命令行参数传递给子进程,方法是将其转换为字符串,然后在子进程中返回 HANDLE(这只是一个 void *)。使用 HANDLE 到套接字的示例代码可以是 found here .
要完成这项工作,您需要确保遵循 Creating a Child Process with Redirected Input and Output密切。在调用 CreateProcess() 并正确设置所有继承设置后,关闭子进程的管道末端很重要。
请注意,我之前尝试在命令行上将 HANDLE 作为字符串传递,但我做错了。我的错误是将 HANDLE 作为 int 传递给 boost::iostreams::file_descriptor(),这使其将其视为文件描述符而不是 Windows HANDLE。
关于c++ - 如何在 Windows 中访问继承的匿名管道 HANDLE,而不是 stdout、stderr 和 stdin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32641423/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende