我需要创建一个新的进程,将标准错误流重定向到某个文件。用于创建子进程的代码没有可用的控制台,因此在某些情况下,GetStdHandle(any)将返回0。由于某些原因(子进程的源代码不可用),子进程将尝试复制其所有标准IO句柄,因此它的所有句柄都应该是有效的。
因此,我需要以与从控制台运行进程相同的方式运行该进程:
someproc <nul >nul 2>err我看到了一些方法: 1.创建两对管道。这可能是一个很好的解决方案,但对我来说太复杂了。2.用CreateFile( "nul“,...)打开”nul“文件函数调用。这个调用没有创建任何文件,但这看起来也很奇怪。3.使用INVALID_HANDLE_VALUE。这也是可行的,但我认为另一个子进程可能会有不同的问题。
我相信还有更好的方法。
发布于 2009-01-13 06:13:07
正如最初所说的,您已经回答了自己的问题。要打开"nul“文件,只需在调用CreateFile时指定"nul"即可。它看起来很奇怪,因为几乎没有人使用过这个文件名。(我没有看到它像我看到的/dev/null那样频繁使用。)不过,这是完全有效的。
但是,如果您发现Invalid_Handle_Value也可以工作,那么请继续使用它。这当然是最简单的。起初,我不会期望它能工作,因为我不希望它是可复制的。
发布于 2009-01-13 06:16:55
是的,"nul“就是按照你的想法去做。如果您迁移到unix,它将是"/dev/null“。这个时髦的名字是从DOS时代遗留下来的,还有"prn“和"com1”等等。
发布于 2009-01-13 09:02:53
将INVALID_HANDLE_VALUE与DuplicateHandle一起使用是不合适的:文档中指出,您需要在句柄上拥有PROCESS_DUP_HANDLE访问权限。你没有那个righton INVALID_HANDLE_VALUE。不过,Device NUL (指向/device/null的符号链接)可以正常工作。
https://stackoverflow.com/questions/438092
复制相似问题