【问题标题】:How to create named pipe (mkfifo) with .net6 in linux?如何在 linux 中使用 .net6 创建命名管道(mkfifo)?
【发布时间】:2022-01-21 11:36:36
【问题描述】:

我想在 Linux 中使用 .net6 创建一个命名管道(“mkfifo”)。

使用 NamedPipeServerStream 类对我没有帮助,因为它创建的是套接字文件而不是管道。

这会创建一个套接字:

var notAPipeButsocket = new NamedPipeServerStream("/tmp/my.notpipe", PipeDirection.Out, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous);
        notAPipeButsocket.WaitForConnection();

微软似乎选择在 linux 中使用套接字显式实现“NamedPipeServerStream”:Why not use Unix Domain Sockets for Named Pipes?

如何在Linux中用.net6创建一个真正的命名管道文件并写入其中?

上下文:我想用 WireShark 打开管道。

【问题讨论】:

    标签: c# .net-core pipe .net-6.0


    【解决方案1】:

    到目前为止,我发现如何从 .net6 创建命名管道 (mkfifo) 的唯一方法是使用 Mono:

    https://github.com/dotnet/runtime/issues/24390#issuecomment-384650120

    您可以使用 .NET Core 上的 Mono.Posix.NetStandard 库来获取 访问 mkfifo POSIX 命令。这将允许您的程序 读取/写入 FIFO/Unix 命名管道。

    https://github.com/mono/mono/blob/47187bbc9b552f6ca5b2d80a2be6c7395b40da9e/mcs/class/Mono.Posix/Mono.Unix.Native/Syscall.cs#L4013-L4017

    要在命名管道中写入,您可以像这样简单地使用 FileStream:

    using FileStream fs = File.OpenWrite(namedPipePath);
    fs.WriteByte(134);
    

    请注意,此调用将阻塞,直到其他人(另一个进程或任何人)开始读取它。

    在我的情况下,无需在 .net6 中创建它就足以写入管道,因为我可以通过 mkfifo 在终端创建它。

    【讨论】:

      猜你喜欢
      • 2011-02-13
      • 1970-01-01
      • 2010-11-24
      • 2010-10-09
      • 2012-07-29
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多