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

use*_*035 6 c# pipe .net-core .net-6.0

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

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

这将创建一个套接字:

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

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

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

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

use*_*035 2

到目前为止,我发现如何从 .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);
Run Code Online (Sandbox Code Playgroud)

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

就我而言,写入管道就足够了,而无需在 .net6 中创建它,因为我可以通过 .net6 创建它的终端mkfifo

编辑

我找到了创建管道的解决方案。只需使用 Process 类:

ProcessStartInfo startInfo = new ProcessStartInfo("mkfifo");
startInfo.Arguments = "pathtonamedpipe";
Process.Start(startInfo);
Run Code Online (Sandbox Code Playgroud)