如何打开“nul”文件?

时间:2009-01-13 06:04:26

标签: winapi

我需要使用重定向的标准错误流创建一个新进程到某个文件。正在创建子进程的代码没有可用的控制台,因此有些情况下GetStdHandle(any)将返回0.由于某种原因,子进程将尝试复制其所有标准IO句柄(子进程的源代码不可用)所以它的所有句柄都应该有效。

所以我需要以与从控制台运行的方式相同的方式运行该过程:

someproc <nul >nul 2>err

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

我相信有更好的方法。

3 个答案:

答案 0 :(得分:6)

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

但如果你发现Invalid_Handle_Value也有效,那么继续使用它。这当然是最简单的。最初,我不希望它起作用,因为我不希望它是可复制的。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

INVALID_HANDLE_VALUE与DuplicateHandle一起使用是不合适的:文档说明您需要在句柄上PROCESS_DUP_HANDLE访问权限。你没有那个正确INVALID_HANDLE_VALUE。设备NUL(指向/device/null的符号链接)可以正常工作。