我有一个旧应用程序,正在尝试在Azure worker 下运行。该应用程序通过创建匿名管道,将stdout重定向到管道,产生一个子进程,然后使用该管道进行通信,使用一种相当常见的模式来启动子进程。
为了使其在Azure下运行,我对启动整个过程的dll进行了P / Invoke调用。
所有这些都可以在Azure外部正常运行,但是即使在模拟器下运行也无法成功。
在Azure下运行时,proc无法通过管道进行通信。具体来说,父级在管道句柄上读取的调用失败(超时)。
最佳答案
我终于发现问题是因为遗留代码正在复制标准输出句柄以传递给子进程。
在Azure下运行,用于STDOUT的GetStdHandle返回0x0。基本上,这意味着“没有错误,但是您没有STDOUT”。显然,您需要检查0x0和INVALID_HANDLE。
创建句柄,然后在启动子级之前将它们设置在STARTUPINFO上,而不是复制现有的句柄,从而固定了所有内容。