【问题标题】:working with fifo data on linux using dotnet core使用 dotnet core 在 linux 上处理 fifo 数据
【发布时间】:2019-11-11 14:06:00
【问题描述】:

我想在磁盘上使用 Linux 的类 fifo 流(使用 mkfifo 创建)和 C# 代码(dotnet 核心)。我正在寻找使用磁盘上数据的示例,但我无法找到这些示例。

我想对磁盘上的 fifo 数据(例如 first.raw)进行一些修改,并使用另一个工具/任务(用 dotnet core 编写)读取该 fifo 并进行另一个修改并将其发送到另一个 fifo 数据(例如second.raw),最后通过使用第三个工具/任务读取 second.raw 数据对其进行修改并发送到另一个 fifo 数据(例如third.raw)以由另一个工具读取。

是否可以在 Linux 上使用 dotnet core?在 Linux 上是否有任何正确的方法(队列、命名管道)?

编辑
当我在 Ubuntu 18.04 上执行此操作时(运行前:mkfifo fifoStream.pipe):

FileStream fs = File.OpenWrite( "fifoStream.pipe" );  
using (var sw = new StreamWriter(fs))  
{  
  sw.WriteLine("first line");  
  sw.Flush();
}    
fs.Close();  

运行代码挂了,我必须使用 ctrl+c 来停止应用程序的执行。

【问题讨论】:

  • 请向我们展示您的尝试
  • 在 Linux 或 UNIX 上(几乎)一切都是文件,因此您可以像打开任何其他文件一样打开 FIFO。 open 将阻塞直到另一端也打开它,如果 FIFO 缓冲区分别为空或已满,readwrite 操作可能会阻塞。您无法修改 磁盘上的 FIFO 数据,您只能从 FIFO 读取数据,对其进行修改并将其写入其他位置,例如到另一个 FIFO。 mkfifo 创建的 FIFO命名管道。
  • 管道是标准输入/输出。在 c# 标准输入/输出是 Console.Read() 和 Console.Write()。

标签: c# linux .net-core pipe


【解决方案1】:

我找到了适用于 Ubuntu 18.04 的解决方案。 根据:https://johnkoerner.com/csharp/IPC-in-net-core-using-protobuf/ 这适用于我的情况:

首先运行“服务器”代码:

static void Main(string[] args)
{
    Console.WriteLine("Starting Server");

    var pipe = new NamedPipeServerStream("fifoStream.pipe", PipeDirection.InOut);
    Console.WriteLine("Waiting for connection....");
    pipe.WaitForConnection();

    Console.WriteLine("Connected");
    pipe.WriteByte(66);
    pipe.Disconnect();
}

然后运行“客户端”代码:

static void Main(string[] args)
{
    Console.WriteLine("Starting Client");
    var pipe = new NamedPipeClientStream(".", "fifoStream.pipe", PipeDirection.InOut, PipeOptions.None);
    Console.WriteLine("Connecting");
    pipe.Connect();
    pipe.ReadByte(); //here I receive byte 66

    Console.WriteLine("Done");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 2018-03-07
    • 2019-03-15
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多