微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 当尝试将StreamWriter打开到命名管道时,Mono挂起

我正在编写的程序是在 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 in Mono

基本上将NamedPipeServerStream传递给读写器.

我怀疑它以前工作,因为P1打开Reader,然后Writer,而P2打开Writer,然后Reader读取器打开P1.

原文地址:https://www.jb51.cc/csharp/95405.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐