gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:07:36 24 4
gpt4 key购买 nike

我正在编写的程序在 Linux 中使用 FIFO 管道进行进程间通信。这充其量是相当 hacky,但不管我遇到什么问题。

        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", };
Process proc = new Process() { StartInfo = startInfo, };
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 的阻塞。

关于c# - 尝试将 StreamWriter 打开到命名管道时 Mono 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43838546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com