Node.js групповой вывод из приложения chid_process c - PullRequest
1 голос
/ 28 марта 2019

Я подключаю удаленный клиент к приложению c через службу node.js и у меня возникают проблемы при отделении операторов printf() от приложения c при выводе из приложения node.js.

Когда операторы printf() выполняются в быстрой последовательности, приложение node.js печатает их вместе. Это вызывает ошибки при синтаксическом анализе этого вывода клиентом.

Поскольку я новичок в c и все еще нахожусь в node.js, мое тестирование привело меня к предположению, что проблема связана с тем, как node.js обрабатывает поток stdout из child_process.

Следует также отметить, что выходные данные не всегда неверны. В коде есть несколько мест, где он более изменчив и коррелирует со скоростью пользовательских вводов (это для игры). Пример, которым я поделился ниже, - это случай, когда вывод наиболее последовательно некорректен.

Я пробовал:

  • Запуск программы c напрямую. (Это дает мне ожидаемый [правильный] результат)
  • Настройка размера буфера в c с помощью setvbuf (неожиданный результат от приложения node.js)
  • Запуск приложения c из узла с синхронной и асинхронной версиями spawn и exec (неожиданный результат от приложения node.js)

Вот часть приложения c:

void readPin(int outputPin){

  if(output[lightPins[light]] == outputPin){
    reportGameStatus("light match");
    lightSuccess();
  }
  ...
}

void lightSuccess(){
  reportGameStatus("light success");
  ...

}

void reportGameStatus(char* event){
  printf("{"
        "\"event\":\"%s\","
      "}\n",
        event
      );

    fflush(stdout);
}

А вот часть node.js:

var spawn = require("child_process").spawn;
var process = spawn("./cApplication");

process.stdout.on('data',function(msg){
    console.log('stdout: ' + msg);
        ...
});

Это приводит к следующему выводу из приложения node.js:

stdout: {"event":"light match"}{"event":"light success"}

Ожидаемый результат:

stdout: {"event":"light match"}
stdout: {"event":"light success"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...