缺少主程序中控制台子进程的管道输出(Pari / GP,cygwin?)

时间:2016-02-09 09:51:14

标签: windows delphi cygwin pipe pari

我有一个用户GUI(在Delphi 6中,32位)用于数学控制台程序Pari / GP:我在一个不可见的子过程窗口中调用Pari / GP并使用管道STDIN和STDOUT进行通信,并且我可以从Delphi中的源代码中识别出控制台子进程,也就是STDERR。

使用Pari / GP 2.2.11版本到版本2.4左右一切正常,我通过等待提示确定与子进程的通信开始和结束(这是异步的) 。但是从版本2.5开始,管道不再获得提示。但是,当我在cmd窗口中启动Pari / GP时,我会有完整的对话框,包括提示。 (我是Win7,64位,但这似乎没有关系,在XP,32位的虚拟机中行为相同)

我没有Pari / GP软件的源代码,但版本之间可能存在显着差异,新版本没有外部cygwin.dll。

问:这种行为是否已经知道,还有其原因?一个已知的解决方法?同时暗示可能最有可能的原因是有用的。

<小时/> 根据要求,更多背景。 在Delphi-6中,我使用过程“createconsoleprocess”(由Jedi-project实现),它为不可见的子进程提供writeln(<string>)和两个稍微不同的永久线程,它们通过管道异步等待响应(我假设,{ {1}})。对于所有版本,wörks仍然没问题 但在每个响应的旧版本中都是Pari / GP stdout(只是一些字符,如Dos窗口中的Dos-prompt)。附加到答案的最后部分,以便我可以解析响应的各个部分,直到prompt - 符号出现,然后可以通过字符表列表将完整答案显示为Pari / GP输出给用户。

在Pari / GP 2.5版本之后,该提示不再发生,因此如果我不进行更正,则用户无限期地等待完成Pari / GP响应。这对我来说是不可能的 - 无论是通过更改用于提示和回显的软件标志,无论是通过管道定义中的prompt进行hackwise替换stdout来产生提示。疯狂:如果我只是通过cmd在单独的Windows控制台中启动Pari / GP,那么提示就在那里 - 好像有一个新的管道,stderr是未知的,但是对于windows-os和提示符已知是通过这个新管道发出的。

对版本唯一可能相关且可见的修改似乎是,旧版本的Pari / GP为createconsoleprocess,而较新版本没有。{但是我不知道cygwin的秘密,尽管我之前已经下载了一些文档 - 但这不是我的专业知识......

这是显示通信原理的图像。我们看到了GUI的窗口,它有一个Pari / GP子进程,它通过CreateConsoleProcess-procedure提供的STDIN / STDOUT管道在后台进行通信。 image

我还有一个精确的调试工具,可准确显示管道上的字符串流量。只是在较新的版本中,在STDOUT消息的末尾不再附加提示字符串,(我也无法通过STDERR通信找到它),但是简单的cmd-console窗口 已经 这个提示,所以它必须在任何地方......

1 个答案:

答案 0 :(得分:0)

看起来,问题不是某种已知的cygwin-incompatibility等相关的问题,因此stackoverflow可能不是提出这个问题的最佳位置,所以我在这里结束案例。

<小时/> 搜索结果:在查看Pari / GP版本的c源后,我觉得我找到了原因。除了通过 stdout 之外,我找不到 write()(或包装它)所以这个想法,他们可能为<引入了另一个/一种新类型的管道em>提示似乎无效。

虽然我不熟悉c语言,但在我看来,在将结果输出到输出通道的关键例程中有代码,删除之前添加的发送前,输出字符串中的提示符字符串。有一些标志和 if s和 else 围绕这个,所以可能是他们之前确定的,程序是否是由dos / windows-console启动的(然后保留提示字符串)或其他进程(然后删除提示字符串) - 有一个名为 isinteractive 的标志,其中包括该源代码段中的切换。

因此,缺少cygwin.dll影响的问题可能与此特定问题无关 - 除了只是这个是没有设置标志的原因......

我会尝试联系软件作者以获得具体帮助。