- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在编写的程序在 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 传递给读取器/写入器。
我怀疑它之前是有效的,因为 P1 打开了 Reader,然后是 Writer,而 P2 打开了 Writer,然后是 Reader,从而解除了 P1 的阻塞。
关于c# - 尝试将 StreamWriter 打开到命名管道时 Mono 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43838546/
StreamWriter.Flush() 和 StreamWriter.Close() 在功能上有什么区别? 当我的数据没有正确写入文件时,我将 Flush() 和 Close() 添加到我的代码末尾
我需要尽快写入许多文件,但我没有像我使用的那样使用 Streamwriter 获得我想要的结果。例如,如果我写... $File = "c:\somefile" $Contents = get-con
我正在尝试创建一个程序,将文本文件中的几行从文本框编辑为用户设置值。 至少,在我开始使用这个值设置之前。我什至无法编辑该文件。这段代码有什么问题?我实际上尝试了更多示例,但没有一个起作用。 priva
遇到一个问题,streamwriter 在我正在生成的 csv 中生成错误的字符。字符  只出现在文件的开头: 5,"GEN",555555555,,"Evan","Smith",,,,,
我正在尝试创建一个程序,从文本框中将文本文件中的几行编辑为用户设置的值。 至少,在我懒得开始这个值设置之前。我什至无法编辑文件。这段代码有什么问题?我实际上尝试了更多示例,但没有一个有效。 priva
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
如何写入不同类的文件? public class gen { public static string id; public static string m_graph_file; } s
我正在使用 StreamWriter 类将一些文本写入新创建的文本文件,但输出总是出奇地错误,这是我的代码: StreamWriter sw = new StreamWriter("newtextfi
basicLog 是名称和时间戳的列表。我想将它们写入文件。我得到的两个错误是在 ';'在 StreamWriter 行和"file"上。在第二行。 ';'错误是:可能错误的空语句文件错误是:当前上下
这是我的代码。 : FileStream fileStreamRead = new FileStream(pathAndFileName, FileMode.OpenOrCreate, FileAcc
我已经初始化了 StreamWriter 实例并将其与“MyFile.txt”相关联 System.IO.StreamWriter sw = new StreamWriter("MyFile.txt"
我在字符串变量中有大量内容,我想使用流写入器将该内容写入文本文件。但是流编写器正在截断文本而不是将整个内容写入文件。为什么? using (StreamWriter sw = new StreamWr
我有一种方法可以将文件作为附件发送。我使用 StreamWriter 和 MemoryStream 来创建附件。代码如下: public void ComposeEmail(string from,
我试图每小时创建一个新的日志文件,并在服务器上运行以下代码。当天的第一个日志文件正在创建并写入正常,但当天没有创建更多的日志文件。任何想法可能出了什么问题?也不会抛出异常。 private void
我正在为我的游戏制作一个关卡编辑器,大部分工作正常,除了...当我尝试保存我的文件 (XML) 时,文件没有创建,在输出框中我得到: “System.NullReferenceException”类型
我在 form1 中有一个文本框和一个按钮,当我在文本框中书写时,我可以使用我的按钮将其保存到计算机上的文件中。这是放在我的按钮里面 public void button1_Click(obj
我目前的申请有问题,我开始认为这只是我的逻辑。即使浏览了这些表格和 MSDN,我也无法弄清楚。 我正在尝试使用 StreamWriter 在我的应用程序目录中创建文本文档并创建包含该文档的子文件夹。目
我组织了一个小类来实现一个快速记录器。我用一个在构造函数中实例化的私有(private) System.IO.StreamWriter 组成它。因为我使用的方式阻止我实现 using block ,所
我有一个使用此方法的 C# .NET 3.5 Windows 窗体程序: private void toLog(string sLog) { richTextBox1.
这里真的很迷茫。我正在运行 Windows 7 并使用管理员帐户,但由于某种原因,以下代码正在下降; public static readonly string Report = Path.Combi
我是一名优秀的程序员,十分优秀!