gpt4 book ai didi

windows - 我可以使用什么来代替 Unix 管道在 Windows 上进行进程间通信?

转载 作者:可可西里 更新时间:2023-11-01 09:38:30 24 4
gpt4 key购买 nike

我有一个启动子进程的应用程序。子进程从标准输入读取要操作的文件。对于某些操作,它需要一个输入文件,其中包含有关如何处理它所操作的文件的信息——我们称之为“控制文件”。控制文件的名称也从标准输入中读取。父应用程序可以使用临时文件作为控制文件,但我更愿意避免使用真正的磁盘备份文件。

在 Linux 上,这很简单:我可以创建一个 Unix 管道,fork,在启动子进程之前关闭管道的各个端点,然后使用 /dev/fd/3(或任何文件描述符)作为控制文件名,然后将控制数据写入父应用程序中的管道。或者,我可以在 /tmp(或其他任何内容)中使用命名管道。

我怎样才能在 Windows 上实现类似的功能? Windows 提供的奇怪的“命名管道”是否可以用于此目的,也就是说,它们可以被通常的 C 库 fread() 函数读取吗?如果是,我使用什么文件名来访问它们?还是有比使用命名管道更好的方法?

(子进程是 exiftool command-line utility 以批处理模式运行,所以我无法控制它。父应用程序是用 Python 编写的。)

最佳答案

更新:

@Harry Johnston 指出我误读了您的问题 - 您不想修改子流程。在这种情况下,您可以尝试调用 CreateProcess并填写hStdInput member of STARTUPINFO使用来自 CreateNamedPipeHANDLE

上一个答案:

一般来说,Windows CRT(C 运行时,或 Unix 中的“libc”)是一个奇怪的野兽:它是 C 标准库的一个非常“准系统”的 shim,带有一些额外的东西在,维护得不是很好,也没有暴露 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 文件描述符的奇怪 mock 。然后你可以用 _fdopen 得到一个 FILE* .

If yes, what file name do I use to access them?

我想您可以尝试随机生成一个不会发生冲突的。也许以您的应用程序名称作为前缀,并采用进程 ID 和当前时间的某种组合?这就是我要扔掉的东西。

Or is there a better way than using named pipes?

您可以在 AF_UNIX 系列中使用套接字,尽管它最终会非常相似...

关于windows - 我可以使用什么来代替 Unix 管道在 Windows 上进行进程间通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11766516/

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