Я подключаю удаленный клиент к приложению 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"}