簡體   English   中英

沒有從nodejs生成的進程接收stdout

[英]Not receiving stdout from nodejs spawned process

我正在嘗試讓nodejs冒險 ,一個舊的基於文本的游戲進行交互。 這個想法是將冒險作為一個子進程開放,然后通過寫入stdin並在stdout上放置一個事件監聽器來玩游戲。

游戲開始時,會打印出一個初始值:

歡迎來到冒險! 你想要指示嗎?

所以為了說明我的問題,我有一個nodejs + express實例:

var childProcess = require('child_process');
var spawn = childProcess.spawn;
var child = spawn('adventure');

console.log("spawned: " + child.pid);

child.stdout.on('data', function(data) {
  console.log("Child data: " + data);
});
child.on('error', function () {
  console.log("Failed to start child.");
});
child.on('close', function (code) {
  console.log('Child process exited with code ' + code);
});
child.stdout.on('end', function () {
  console.log('Finished collecting data chunks.');
});

但是當我啟動服務器時,游戲中的文本沒有到達事件監聽器:

spawned: 24250

這就是我得到的所有輸出。 永遠不會調用child.stdout.on甚至是監聽器。 為什么游戲中的初始線不會被拾取?

如果我將以下行附加到上面的javascript塊,則程序輸出立即出現。 所以adventure運行,我現在可以強制它觸發child.stdout.on事件監聽器...但這也結束了子進程,這違背了讀寫它的目的。

...
child.stdout.on('end', function () {
  console.log('Finished collecting data chunks.');
});
child.stdin.end();

現在的輸出是:

spawned: 28778  
Child data:
Welcome to Adventure!!  Would you like instructions?
user closed input stream, quitting...

Finished collecting data chunks.
Child process exited with code 0

我確信這對我來說是一個微不足道的疏忽,我感謝任何有助於解決這個問題的人。

經過Nodejs文檔幾次之后,我確信自己錯過了一些非常大的東西,或者spawn命令無法正常工作。 所以我創建了一個github問題

答案立即發布:如果您想快速訪問,子進程無法緩沖輸出。

所以要實現我最初尋找的東西:

var childProcess = require('child_process');
var spawn = childProcess.spawn;
var child = spawn('unbuffer', 'adventure');

console.log("spawned: " + child.pid);

child.stdout.on('data', function(data) {
  console.log("Child data: " + data);
});
child.on('error', function () {
  console.log("Failed to start child.");
});
child.on('close', function (code) {
  console.log('Child process exited with code ' + code);
});
child.stdout.on('end', function () {
  console.log('Finished collecting data chunks.');
});

功能差異在於使用unbuffer ,這是一個禁用輸出緩沖的命令。

為什么游戲中的初始線不會被拾取?

我在從node.js調用編譯的C ++程序的項目上遇到了同樣的問題。 我意識到問題出在編譯的C ++程序中:我沒有刷新stdout流。 添加fflush(stdout); 印刷線后解決了問題。 希望你仍然可以訪問游戲的來源!

傳遞的data是緩沖區類型,而不是字符串。 因此,您需要一個解碼器來讀取該緩沖區,然后進行日志記錄。

這是怎么做的。

var StringDecoder = require('string_decoder').StringDecoder;
var decoder = new StringDecoder('utf8');

child.stdout.on('data', function (data) {
    var message = decoder.write(data);
    console.log(message.trim());
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM