2009-01-13 67 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)將正常工作,但。