2009-01-13 45 views
5

我需要用重定向的标准错误流创建一个新的进程到某个文件。创建子进程的代码没有可用的控制台,因此有时候GetStdHandle(any)将返回0.子进程将尝试复制其所有标准IO句柄(出于某种原因)(子进程的源代码不可用)所以它的所有句柄都应该是有效的。如何打开“nul”文件?

所以我需要运行过程中以同样的方式,因为它是可以从控制台跑了:

someproc <nul >nul 2>err 

我看到这一些方法: 1.创建两对管。这可能是一个很好的解决方案,但对我来说这太复杂了。 2.使用CreateFile(“nul”,...)函数调用打开“nul”文件。这个调用没有创建任何文件,但这看起来很奇怪。 3.使用INVALID_HANDLE_VALUE。这也适用,但我认为可能会有与另一个子进程不同的问题。

我相信有更好的方法。

+0

非常好!感谢列出可能性。 – 2014-02-27 03:31:52

回答

6

正如原来的措辞,你已经回答了你自己的问题。要打开“nul”文件,只需在致电CreateFile时指定"nul"即可。它看起来很奇怪,因为几乎没有人使用该文件名。 (我没有看到它使用的频率几乎和我看到的一样多,/dev/null。)但它完全有效。

但是,如果您发现Invalid_Handle_Value也适用,那么请继续使用它。这当然是最简单的。我不会期望它起作用,因为我不希望它是可复制的。

2

是的,“nul”正在做你的想法。如果你移动到unix,它将是“/ dev/null”。这个时髦的名字是DOS时代的延续,以及“prn”和“com1”等。

1

使用INVALID_HANDLE_VALUE与DuplicateHandle是不正确的:该文档指出您需要PROCESS_DUP_HANDLE访问权限的句柄。你没有这个权利INVALID_HANDLE_VALUE。设备NUL(符号链接到/device/null)将正常工作,但。