我有一个项目,我认为将是相对比较容易,而是变成更多的痛苦,我希望的。第一,大多数代码的我的相互作用的是传统的代码,我没有控制权,所以我不能做的大范式的改变。

这里有一个简单的解释什么,我需要做到:说我有大量的简单的程序,从中读取stdin写stdout。(这些我不能触摸)。基本上,输入到stdin是一个命令就像"设定的温度到100"或者类似的东西。和输出是一个事件"温度已经设定为100"或"温度已降低于设定点".

什么我想要做的是写一个应用程序,可以开始一些简单的程序、观察事件,然后发送命令他们作必要的。我最初的计划是什么样的popen,但我需要一个双向popen以获得读写水管。我砍死的东西一起,我呼popen2我通过它的执行的命令以及两个文件*,获得充满了读和写流。那么我所需要做的是写一个简单的循环,读从各stdouts从各个进程,并逻辑,它需要并随后写的命令回到适当的处理。

这里的一些伪

FILE *p1read, *p1write;
FILE *p2read, *p2write;
FILE *p3read, *p3write;

//start each command, attach to stdin and stdout
popen2("process1",&p1read,&p1write);
popen2("process2",&p2read,&p2write);
popen2("process3",&p3read,&p3write);

while (1)
{
   //read status from each process
   char status1[1024];
   char status2[1024];
   char status3[1024];
   fread(status1,1024,p1read);
   fread(status2,1024,p2read);
   fread(status3,1024,p3read);

   char command1[1024];
   char command2[1024];
   char command3[1024];
   //do some logic here

   //write command back to each process
   fwrite(command1,p1write);
   fwrite(command2,p2write);
   fwrite(command3,p3write);
}

真正的程序更为复杂的其它偷窥在流,看看什么是等待,如果没有,它会跳过这一进程,同样地,如果它不需要的命令发送到一定的进程,它不。但是,该法赋予的基本思想。

现在这个伟大的作品在我的UNIX框甚至非常好的Windows XP框cygwin。然而,现在我需要得到它的工作on Win32本身。

最难的部分是,我popen2使用叉()和execl进行()启动该进程并分配流标准输入和输出儿童的进程。是否有一个清洁的方式我可以做到这一点,在windows?基本上,我想创建一个popen2工作在窗户相同的方式作为我的unix版本。这种方式的只有windows特定的代码将在这一职能,我能拿走的一切其他工作相同的方式。

任何想法?

谢谢!

有帮助吗?

解决方案

在Windows上,首先调用CreatePipe(类似于pipe(2)),然后调用CreateProcess。这里的技巧是CreateProcess有一个参数,你可以传递新创建的进程的stdin,stdout,stderr。

请注意,当您使用stdio时,需要先执行fdopen来创建文件对象,这需要文件编号。在Microsoft CRT中,文件编号与OS文件句柄不同。因此,要将CreatePipe的另一端返回给调用者,首先需要_open_osfhandle来获取CRT文件编号,然后使用fdopen。

如果您想查看工作代码,请查看

中的_PyPopen

http://svn.python.org /view/python/trunk/Modules/posixmodule.c?view=markup

其他提示

我想你已经做了一个很好的开始为你的问题通过使用popen2()功能抽象走的跨平台的问题。我是想来和建议'座',但我敢肯定这是不相关的后阅读的问题。你可以使用的插座,而不是管道-它会被隐藏在popen2()function.

我99%确定可以实现所要求的功能,使用Windows Api。什么我不能做的就是指向你的右的功能可靠。然而,你应该知道Microsoft具有最POSIX-like API电话提供,但该名作为前缀以'_'.也有本地API调,实现的效果 forkexec.

你的意见表明,你是知道的问题与数据的可用性和可能的僵局-是谨慎的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top