我試圖訪問從控制檯接收輸入的文件描述符。我正在使用
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
,系統調用:讀
如果您沒有,應爲您創建一個。 'inputProgram'是一個控制檯應用程序嗎? 'CreateFile'是否失敗,如果是,返回什麼錯誤代碼?如果不是,到底什麼地方出了錯,什麼時候? –
如果有幫助,inputProgram是一個node.js過程,如果我明白這意味着什麼,它應該是一個控制檯應用程序。CreateFile不會失敗,但將文件句柄傳遞給libuv以從文件句柄創建一個readstream會導致應用程序退出,可能是segfault。我懷疑是控制檯輸入沒有引用父cmd窗口的輸入。 –
你應該繼承父母的控制檯。如果您只是針對句柄發出「ReadFile」,會發生什麼?我擔心實際的問題深深嵌入libuv中,我不熟悉 - 你有源代碼嗎?你能夠在調試器中運行它以查看實際故障的位置? –