2014-03-19 53 views
2

我試圖訪問從控制檯接收輸入的文件描述符。我正在使用

HANDLE fd = CreateFile(
    "CONIN$", 
    GENERIC_READ | GENERIC_WRITE, 
    TRUE, 
    0, 
    OPEN_EXISTING, 
    0, 
    0); 
SetConsoleMode(fd, ENABLE_WINDOW_INPUT); 

然後將fd返回到一個程序,該程序從控制檯讀取(基於libuv)輸入。

時在控制檯執行的過程,但是從FD崩潰閱讀這工作得很好,當我管輸入到程序

echo hello | inputProgram 

我有一個懷疑,不存在與輸入的進程相關聯的控制檯,但我不確定。如何以這種方式執行時正確讀取輸入到cmd窗口?


所以我在Node.js中綁定到這個C++程序。我打電話

var ReadStream = require("tty").ReadStream(); 
var TTY = process.binding("tty_wrap").TTY; 

module.exports = function() { 
    var opentty = require("./bin/opentty.node") // program returns the fd int 
    var fd = opentty(); 
    var t = new _TTY(fd, true); 
    return new ReadStream(t); 
} 

opentty在文件句柄的重定向輸入模式下返回3。與此文件句柄打交道的代碼可以在這裏找到

https://github.com/joyent/node/blob/master/src/tty_wrap.cc#L185

基本上調入uv_tty_init這裏

https://github.com/joyent/node/blob/master/deps/uv/src/win/tty.c#L99

流錯誤發現Error: read EBADF,系統調用:讀

+0

如果您沒有,應爲您創建一個。 'inputProgram'是一個控制檯應用程序嗎? 'CreateFile'是否失敗,如果是,返回什麼錯誤代碼?如果不是,到底什麼地方出了錯,什麼時候? –

+0

如果有幫助,inputProgram是一個node.js過程,如果我明白這意味着什麼,它應該是一個控制檯應用程序。CreateFile不會失敗,但將文件句柄傳遞給libuv以從文件句柄創建一個readstream會導致應用程序退出,可能是segfault。我懷疑是控制檯輸入沒有引用父cmd窗口的輸入。 –

+0

你應該繼承父母的控制檯。如果您只是針對句柄發出「ReadFile」,會發生什麼?我擔心實際的問題深深嵌入libuv中,我不熟悉 - 你有源代碼嗎?你能夠在調試器中運行它以查看實際故障的位置? –

回答

1

通過Node存儲庫看起來很清楚,new _TTY(fd, true)正在等待C文件描述符,但是你傳遞它一個Win32句柄。

_open_osfhandle函數根據句柄創建文件描述符。

所以,你應該嘗試

var t = new _TTY(_open_osfhandle(fd), true); 

(如在評論中討論的,如果你與libuv共享C運行時,這纔有效。)

理想情況下,你會用libuv的開放功能,但遺憾的是在fs__open了一個錯誤:

case _O_RDWR: 
    access = FILE_GENERIC_READ | FILE_GENERIC_WRITE; 

這是它決定請哪些訪問權限。正如名稱所示,FILE_GENERIC_WRITE和FILE_GENERIC_READ是特定於文件的文件,不能用於打開CONIN $。它應該是

case _O_RDWR: 
    access = GENERIC_READ | GENERIC_WRITE; 

這將適用於文件和其他類型的對象,如控制檯輸入和輸出。 (我已經在一個簡單的C程序中再現了這一點;在我的系統中,使用FILE_ *權限絕對會阻止您打開CONIN $。)

+0

我試過了。 C文件描述符與本場景中的句柄相同,即HANDLE爲3,並且返回_open_osfhandle(fd,_O_RDWR)也返回3. –

+0

數字相同的事實是巧合 - 並非特別奇怪,因爲它們都從0開始計數。所有這一切意味着在代碼中的這一點,您具有與文件描述符相同數量的句柄。 –

+0

......或者可能不是,Win32手柄似乎有點奇怪;可能與cmd.exe如何設置繼承的句柄或者如何初始化控制檯模式應用程序有關,我不確定。 –

相關問題