Sve*_*ach 5 linux windows ipc pipe named-pipes
我有一个启动子进程的应用程序。子进程从标准输入读取要操作的文件。对于某些操作,它需要一个输入文件,其中包含有关如何处理它在 \xe2\x80\x93 上操作的文件的信息,我们将其称为“控制文件”。控制文件的名称也是从 stdin 读取的。父应用程序可以使用临时文件作为控制文件,但我更愿意避免使用真正的磁盘支持文件。
\n\n在Linux上,这很简单:我可以创建一个Unix管道,分叉,在启动子进程之前关闭管道的相应端,并使用/dev/fd/3(或任何文件描述符)作为控制文件名,然后将控制数据写入父应用程序中的管道。或者,我可以使用命名管道/tmp(或其他)。
我怎样才能在 Windows 上实现类似的事情?Windows 提供的奇怪的“命名管道”是否可以用于此目的,即可以通过常用的 C 库函数读取它们fread()?如果是,我应该使用什么文件名来访问它们?或者有比使用命名管道更好的方法吗?
(子进程是以批处理模式运行的exiftool命令行实用程序,因此我无法控制它。父应用程序是用 Python 编写的。)
更新:
@Harry Johnston 指出我误读了你的问题 - 你不想修改子流程。在这种情况下,您可以尝试调用并用fromCreateProcess填写hStdInput成员STARTUPINFO。HANDLECreateNamedPipe
之前的回答:
一般来说,Windows CRT(C 运行时,或libcUnix 中的“”)是一个奇怪的野兽:它是 C 标准库的一个非常“准系统”的填充程序,其中添加了一些额外的东西,维护得不是很好,也没有暴露太多Windows 可以做什么。用 C 语言编写 Windows 软件的最自然方式是 Win32 API。那是说:
Windows 提供的奇怪的“命名管道”是否可以用于此目的,即可以通过常用的 C 库 fread() 函数读取它们?
是的,我相信您可以使用 来做到这一点_open_osfhandle,其中第一个参数可以是HANDLE。这会给你一个整数,这是 Windows CRT 对 Unix 文件描述符的奇怪嘲笑。然后你就可以得到一个FILE*with _fdopen。
如果是,我应该使用什么文件名来访问它们?
我想你可以尝试生成一个不会发生碰撞的随机的。也许可以在它前面加上应用程序的名称作为前缀,并采用进程 ID 和当前时间的某种组合?这只是我要扔掉的东西。
或者有比使用命名管道更好的方法吗?
你可以在家庭中使用套接字AF_UNIX,尽管它最终会非常相似......