我正在编写的程序是在
linux中使用FIFO管道进行进程间通信.这是最好的黑客,但不管我有问题.
if (!File.Exists(Path.GetTempPath() + "gminput.pipe")) { ProcessStartInfo startInfo = new ProcessStartInfo() { FileName = "/usr/bin/mkfifo",Arguments = Path.GetTempPath() + "gminput.pipe",}; Process proc = new Process() { StartInfo = startInfo,}; proc.Start(); proc.WaitForExit(); } if (!File.Exists(Path.GetTempPath() + "gmoutput.pipe")) { ProcessStartInfo startInfo = new ProcessStartInfo() { FileName = "/usr/bin/mkfifo",Arguments = Path.GetTempPath() + "gmoutput.pipe",}; proc.Start(); proc.WaitForExit(); } using (StreamWriter outputPipe = new StreamWriter(Path.GetTempPath() + "gmoutput.pipe")) using (StreamReader inputPipe = new StreamReader(Path.GetTempPath() + "gminput.pipe")) { Console.WriteLine("This code is never reached!"); }
我所做的就是检查管道是否已经存在,如果没有,调用mkfifo来创建它.这部分似乎工作正常,命名的管道正确创建.每当我尝试打开它们(使用StreamWriter,StreamReader或两者)时,程序就挂起.没有错误或任何东西.它也挂在调试器中.
最好的部分是…它曾经工作.我有进程间通信工作,然后只是莫名地停止.除了你在这里看到的内容,重新启动我的系统,重新创建管道等,我没有评论.是什么赋予了?我的代码有什么问题,还是系统上的其他东西干扰?
解决方法
这是设计.尝试以下操作:打开2个bash终端,创建一个管道,然后在其中一个终端上读取,并写入另一个终端.例如
>mkfifo test.fifo >echo "test" > test.fifo >cat test.fifo
你会看到,无论订单如何,每一方阻止对方的等待.
过程1的输入管道是过程2的输出管道,反之亦然.如果两个进程使用相同的代码访问管道,进程1读取其输入管道并阻止等待进程2写入东西.进程2还读取它的输入管道并等待进程1写入,但进程1等待,甚至没有打开另一个管道.僵局.
解决这个问题的一个方法是在一个单独的线程中运行读者或作者.这样的过程1& 2打开两个管道,并且锁定被解决.
另一个选项是异步打开管道.我的C#是生锈的,但是stackoverflow有很多例子:
How to do a non-waiting write on a named pipe (c#)?
基本上将NamedPipeServerStream传递给读写器.
我怀疑它以前工作,因为P1打开Reader,然后Writer,而P2打开Writer,然后Reader读取器打开P1.