我有一个遗留应用程序,我试图在Azure工作者下运行。该应用程序使用一种相当常见的模式来启动子进程,方法是创建一个匿名管道,将stdout重定向到管道,生成子进程,然后使用管道进行通信。
为了让它在Azure下运行,我对启动整个过程的dll进行P / Invoke调用。
所有这些在Azure之外工作正常,但即使在模拟器下运行也会失败。
在Azure下运行时,procs无法通过管道进行通信。具体来说,父进程读取管道句柄的调用失败(超时)。
答案 0 :(得分:2)
我终于弄清楚问题是因为遗留代码重复了stdout句柄以传递给子进程。
在Azure下运行,STDOUT的GetStdHandle返回0x0。这基本上意味着“没有错误,但你没有STDOUT”。显然,您需要检查0x0 AND INVALID_HANDLE。
创建句柄,在启动子项之前在STARTUPINFO上设置它们而不是复制现有的句柄会修复所有内容。
答案 1 :(得分:-1)
我有两条建议如下:
让我知道你的结果是什么。