我有一个启动子进程的应用程序。子进程从标准输入读取要操作的文件。对于某些操作,它需要一个输入文件,其中包含有关如何处理其操作的文件的信息 - 我们将其称为“控制文件”。控制文件的名称也是从 stdin 读取的。父应用程序可以使用临时文件作为控制文件,但我更愿意避免使用真正的磁盘支持文件。
在 Linux 上,这很简单:我可以创建一个 Unix 管道,分叉,在启动子进程之前关闭管道的相应端,然后使用/dev/fd/3
(或任何文件描述符)作为控制文件名,然后将控制数据写入父应用程序中的管道。或者,我可以使用命名管道/tmp
(管他呢)。
我怎样才能在 Windows 上实现类似的事情? Windows 提供的奇怪的“命名管道”可以用于此目的吗?也就是说,它们可以被常用的 C 库读取吗?fread()
功能?如果是,我应该使用什么文件名来访问它们?或者有比使用命名管道更好的方法吗?
(子进程是exiftool命令行实用程序以批处理模式运行,所以我无法控制它。父应用程序是用 Python 编写的。)
Update:
@Harry Johnston 指出我误读了你的问题 - 你不想修改子流程。在这种情况下,您可以尝试致电CreateProcess并填写hStdInput成员STARTUPINFO with a HANDLE
from CreateNamedPipe
.
之前的回答:
一般来说,Windows CRT(C 运行时,或“libc
“用 Unix 来说)是一个奇怪的野兽:它是 C 标准库的一个非常“准系统”的填充程序,其中添加了一些额外的东西,维护得不是很好,并且没有暴露很多 Windows 可以做的事情。最自然的方式用 C 语言编写 Windows 软件是 Win32 API。也就是说:
Could the strange "named pipes" Windows offers be used for this, that is, can they be read from by the usual C library fread() function?
是的,我相信你可以做到这一点_open_osfhandle,其中第一个参数可以是HANDLE
。这会给你一个整数,这是 Windows CRT 对 Unix 文件描述符的奇怪嘲笑。然后你可以得到一个FILE*
with _fdopen.
If yes, what file name do I use to access them?
我想你可以尝试生成一个不会发生碰撞的随机的。也许可以在它前面加上应用程序的名称作为前缀,并采用进程 ID 和当前时间的某种组合?这只是我要扔掉的东西。
Or is there a better way than using named pipes?
您可以使用套接字AF_UNIX
家庭,虽然最终会非常相似......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)