gpt4 book ai didi

d - 在 D 中创建命名管道?

转载 作者:行者123 更新时间:2023-12-04 18:40:51 26 4
gpt4 key购买 nike

我试图找出 D 中 IPC 可用的方法,主要是命名管道。我知道 std.process 包含来自相关进程的未命名管道的函数,尽管我更多地关注具有双向无关进程的 ipc。我在想我可能需要最终使用本地套接字,或者查看共享内存。

有没有例子可以做到这一点?

最佳答案

在 Unix 上,您可以使用 std.socket 创建一个 unix 域套接字,类似于 TCP 套接字,但仅限于本地。这是一些示例代码:

 // SERVER
import std.socket;
void main() {
auto listener = new Socket(AddressFamily.UNIX, SocketType.STREAM);
listener.bind(new UnixAddress("/home/me/uds"));
listener.listen(10);

/*while(1)*/ {
auto soc = listener.accept();
soc.send("cool\n");
soc.close();
}

listener.close();

import core.sys.posix.unistd;
unlink("/home/me/uds");
}

和客户:
void main() {
auto soc = new Socket(AddressFamily.UNIX, SocketType.STREAM);
soc.connect(new UnixAddress("/home/me/uds"));

import std.stdio;
char[1222] buf;
writeln(buf[0 .. soc.receive(buf)]);
soc.close();
}

他们唯一需要了解的就是消息的含义(当然),以及套接字的文件系统路径。

Unix 也有命名管道,但它们不像 unix 域套接字(或 Windows 命名管道)那样是双向的

如果您确实想要一个 unix 命名管道,它们被称为 FIFO 文件,并且是使用 mkfifo 系统 API 函数制作的。您可以通过 import core.sys.posix.sys.stat; 访问它然后像在 C 中一样使用它:传递一个字符串和模式来创建文件,不要忘记检查返回值,然后用常规的 Unix 文件函数读/写它,例如 read , write , close , 全部来自 import core.sys.posix.unistd; .有关这些功能,请参阅 C 文档,例如 man 2 readman 3 mkfifo如果您使用的是 Linux,或者只是在网上搜索这些页面。

但我认为 unix 域套接字是您正在寻找的,它的工作原理与任何其他套接字基本相同,如我上面的示例所示。

Windows 做事不同,D 标准库甚至不包括 OS API 函数原型(prototype)。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365150%28v=vs.85%29.aspx

您使用该函数创建一个命名管道,为其提供一个其他进程可以使用的路径名(类似于 Unix 域套接字,但不在统一文件系统中)。然后你使用 CreateFile 函数打开管道,然后你可以像任何其他文件一样与它交谈。

有两种方法可以获取函数原型(prototype),因此您可以从 D 中调用这些函数。一种是自己复制/粘贴它们,如下所示:
    extern(Windows)
HANDLE CreateNamedPipeA(
LPCTSTR lpName,
DWORD dwOpenMode,
DWORD dwPipeMode,
DWORD nMaxInstances,
DWORD nOutBufferSize,
DWORD nInBufferSize,
DWORD nDefaultTimeOut,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);

一、 import core.sys.windows.windows;要获得基本的 Windows 类型定义,然后只需将类似的内容添加到您的文件中。它和 MSDN 一样,只是去掉了 In 之类的东西。 (您也可以将它们更改为 D 的 in 关键字)。

最重要的是在名称中添加了 A 或 W。这在有关 Unicode 与 ANSI 名称的 Microsoft 文档底部提到。 A 版本采用 ascii 字符串。 W版取utf-16, wstring在 D 中。推荐 W 版本,但 A 版本在某些情况下更容易使用。

或者,您可以从这里下载预制的 win32 绑定(bind): https://github.com/AndrejMitrovic/DWinProgramming/tree/master/WindowsAPI并在构建时使用它们。

如果你只需要几个函数,我更喜欢复制/粘贴以避免依赖,但如果你正在做大量的 Windows API 工作,请下载完整的绑定(bind)。

我用 D 语言编写了一个使用这些技术的跨平台终端仿真器: https://github.com/adamdruppe/terminal-emulator

可拆卸部分使用 unix 域套接字服务器:
https://github.com/adamdruppe/terminal-emulator/blob/master/detachable.d

可附加部分是 UDS 客户端
https://github.com/adamdruppe/terminal-emulator/blob/master/attach.d

Windows 模拟器核心使用专门的命名管道来执行我自己的异步“匿名”管道,而不是您的用例,但显示了如何调用函数:
https://github.com/adamdruppe/terminal-emulator/blob/master/terminalemulator.d

共享内存是您可以做的另一件事,但期望 D 库提供的帮助很少,您必须使用 OS 函数。但这并不难,至少 Unix 上有函数原型(prototype):导入 core.sys.posix.sys.shm 并使用与 C 中相同的函数。

我从来没有真正在 Windows 上做过,但是快速搜索说你可以制作一个内存映射文件: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551%28v=vs.85%29.aspx

这也许,只是也许会得到火卫队的帮助: http://dlang.org/phobos/std_mmfile.html但同样,我从来没有真正尝试过这个。当我需要共享内存时,我只是做了 shmget 等 Unix 函数(这是在我的 simpledisplay.d https://github.com/adamdruppe/arsd/blob/master/simpledisplay.d 中,它使用它与 X 服务器通信)。

不过,底线是 Unix 域套接字与 TCP 套接字基本相同,而 Phobos 的 std.socket 可以提供帮助。

其他所有操作都与您在 C 中的操作相同。

关于d - 在 D 中创建命名管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26709356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com