我有一个遗留应用程序,我试图在Azure工作下运行。该应用程序使用相当常见的模式通过创建匿名管道来启动子进程,将stdout重定向到管道,产生子进程,然后使用管道进行通信。管道读取在Azure上失败
为了让它在Azure下运行,我对启动整个过程的dll进行了P/Invoke调用。
所有这些在Azure之外都可以正常工作,但即使在模拟器下运行时也会失败。
在Azure下运行时,procs无法通过管道进行通信。特别是,由父级读取管道句柄的调用失败(超时)。
我有一个遗留应用程序,我试图在Azure工作下运行。该应用程序使用相当常见的模式通过创建匿名管道来启动子进程,将stdout重定向到管道,产生子进程,然后使用管道进行通信。管道读取在Azure上失败
为了让它在Azure下运行,我对启动整个过程的dll进行了P/Invoke调用。
所有这些在Azure之外都可以正常工作,但即使在模拟器下运行时也会失败。
在Azure下运行时,procs无法通过管道进行通信。特别是,由父级读取管道句柄的调用失败(超时)。
我终于明白,问题是因为遗留代码是复制stdout句柄传递给子进程。
在Azure下运行时,STDOUT的GetStdHandle返回0x0。这基本上意味着,“没有错误,但你没有STDOUT”。显然,你需要检查0x0和INVALID_HANDLE。
创建句柄,在启动孩子之前将它们设置在STARTUPINFO上,而不是复制现有的句柄,从而修复了一切。
我有两个建议如下:
让我知道你的结果是什么。
感谢-1。感谢您提供一些意见,以便我能理解建议的问题。 – AvkashChauhan
我没有倒下,但我怀疑某人所做的原因是因为你的回答只是由问题组成,这些问题作为评论会更合适。 – ildjarn
@Adam,今天我与Azure支持工程师一起解决了您的问题,并能够获得一些帮助。还有其他一些方法可以解决这个问题,我将在稍后添加更多信息。 – AvkashChauhan
您的本地代码是否为x64编译? – ildjarn
是的,我能够浏览模拟器下的代码,并且它只是在通话中阻止阅读。 – AdamC