如何在 linux 中使用 .net6 创建命名管道 (mkfifo)?

How to create named pipe (mkfifo) with .net6 in linux?

我想在 Linux.

中使用 .net6 创建命名管道(“mkfifo”)

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

这将创建一个套接字:

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

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

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

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

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

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

You can use the Mono.Posix.NetStandard library on .NET Core to get access to the mkfifo POSIX command. This will allow your program to read/write to a FIFO/Unix named pipe.

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.

创建它的终端

编辑:

我找到了创建管道的解决方案。简单地使用过程 class:

ProcessStartInfo startInfo = new ProcessStartInfo("mkfifo");
startInfo.Arguments = "pathtonamedpipe";
Process.Start(startInfo);