我有一个用户GUI(在Delphi 6中,32位)用于数学控制台--程序Pari/GP:我在一个不可见的子进程中调用Pari/GP,并使用管道STDIN和STDOUT进行通信,并且就我所能识别的控制台-子进程从Delphi中的源代码而言,也是STDERR。
对于Pari/GP版本2.2.11,到2.4版左右,一切都正常工作,我通过等待(提示符)确定了与子进程通信的开始和结束(这是异步的)。但是,由于版本2.5,管道将不再获得提示。但是,当我在cmd窗口中启动Pari/GP时,我有完整的对话框,包括提示。(我有64位的Win7,但这似乎与此无关,在使用XP,32位的虚拟机中,这种行为是一样的)
我没有Pari/GP-软件的源代码,但是其中一个很大的区别是版本之间没有外部cygwin.dll。
问:这种行为是否已经为人所知,也是其原因?一个已知的解决办法?同时也暗示了最有可能的原因是有帮助的。
按照要求,多一点背景。在Delphi-6中,我使用了过程"createconsoleprocess“(由绝地项目实现),它为不可见的子进程和两个稍微不同的永久线程提供了一个writeln(<string>),它们异步地等待通过管道的响应(我猜想,stdout)。对所有版本都没问题。
但是,在每个响应的旧版本中,都是Pari/GP prompt (只是一些字符,如Dos-窗口中的Dos-提示符)。附加到应答的最后一部分,这样我就可以解析响应的各个部分,直到出现prompt-symbol,然后通过一个字符串列表将完整的答案显示为Pari/GP-输出给用户。
在Pari/GP 2.5版本之后,提示符不再出现,因此如果我不做任何更正,用户将无限地等待Pari/GP-响应的完成。我不可能通过改变提示和回响的软件标志,或者用管道定义中的stdout替换stderr来产生提示。疯狂:如果我只是通过cmd在一个单独的windows-控制台中启动Pari/GP,那么提示符就在那里--好像有一个新管道,createconsoleprocess不知道,但是windows-os知道,提示通过这个新管道发送。
与版本相比,唯一可能相关和可见的修改似乎是,旧版本有一个带有Pari/GP的cygwin.dll,而较新的版本则没有。但我不知道雪佛兰的秘密尽管我之前下载了一些文件但那不是我的专业知识.
这里有一幅图像,它展示了通信的原理。我们看到了我的GUI的窗口,它有一个Pari/GP子进程,它通过CreateConsoleProcess-过程提供的STDIN/STDOUT管道在后台进行通信。

我也有一个精确的调试工具,它可以准确地显示管道上的字符串流。在较新的版本中,提示字符串不再附加在STDOUT-消息的末尾(我也无法通过STDERR-通信找到它),但是简单的cmd-控制台窗口有这个提示,所以它必须在任何地方.
发布于 2016-02-10 19:03:03
看起来,这个问题并不是某个已知的cygwin-不兼容等相关的问题,所以堆栈溢出可能不是问这个问题的最佳地方,所以我在这里结束了这个问题。
搜索结果:在查看了Pari/GP版本的c-来源之后,我觉得我找到了原因。除了通过stdout之外,我找不到write() (或环绕它),因此,他们可能已经为提示引入了另一种/一种新类型的管道,这似乎是无效的。
虽然我不熟悉c语言,但在我看来,在将结果放入输出通道的关键例程中,有代码在发送之前从输出字符串中删除先前添加的提示符字符串。这里有一些标志,如果是s,或者其他的标志,那么它们可能会更早地确定程序是由dos/windows-控制台(然后离开提示字符串)启动的,还是由其他进程(然后移除提示字符串)启动的--还有一个名为isinteractive的标志,它是在源代码段中切换的。
因此,缺失的cygwin.dll的影响问题可能与这个特定的问题无关--只是这是没有设置标志的原因。
我将尝试与软件作者联系,以获得具体帮助。
https://stackoverflow.com/questions/35288771
复制相似问题