다음 C 프로그램 (TEST.C) 고려 스트림 : 표준 출력 할 수있는 선을 인쇄해야Node.js를가
#include <stdio.h>
int main() {
printf("string out 1\n");
fprintf(stderr, "string err 1\n");
getchar();
printf("string out 2\n");
fprintf(stderr, "string err 2\n");
fclose(stdout);
}
는, 라인이 stderr에를 기다립니다 사용자 입력 용으로 stdout에 다른 행을, stderr에 다른 행을 입력하십시오. 아주 기본! 컴파일하고 완전한 (사용자 입력 getchar가 수신됩니다)() 때 명령 줄에서 프로그램의 출력을 실행하면 :
$ ./test
string out 1
string err 1
string out 2
string err 2
다음 코드로 nodejs를 사용하여 자식 프로세스로이 프로그램을 산란하려고 :
var TEST_EXEC = './test';
var spawn = require('child_process').spawn;
var test = spawn(TEST_EXEC);
test.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
test.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
// Simulate entering data for getchar() after 1 second
setTimeout(function() {
test.stdin.write('\n');
}, 1000);
출력은 다음과 같이 나타난다 :
termina에 ./test를 실행하는 경우와 같이 출력과 매우 상이한$ nodejs test.js
stderr: string err 1
stdout: string out 1
string out 2
stderr: string err 2
엘. 이것은 ./test 프로그램이 nodejs에 의해 생성 될 때 대화식 쉘에서 실행되지 않기 때문입니다. test.c stdout 스트림은 버퍼링되며 \ n에 도달하자 마자 터미널에서 실행될 때 버퍼는 플러시되지만 노드와 함께 이런 방식으로 생성 될 때 버퍼는 플러시되지 않습니다. 이것은 모든 인쇄 후에 표준 출력을 플러시하거나 표준 출력 스트림을 버퍼링하지 않도록 변경하여 모든 것을 즉시 플러시 할 수 있습니다. test.c 소스를 사용할 수 없거나 수정할 수 없다고 가정하면 언급 된 두 가지 플러싱 옵션 중 어느 것도 구현할 수 없습니다.
var spawn = require('pty.js').spawn;
var test = spawn(TEST_EXEC);
test.on('data', function (data) {
console.log('data: ' + data);
});
// Simulate entering data for getchar() after 1 second
setTimeout(function() {
test.write('\n');
}, 1000);
출력 :
$ nodejs test.js
data: string out 1
string err 1
data:
data: string out 2
string err 2
그러나 모두
나는 다음 예를 들어, 좋은 일을 pty.js (가상 터미널)있다, 대화 형 쉘을 모방보고 시작 stdout과 stderr는 함께 병합됩니다 (터미널에서 프로그램을 실행할 때 알 수 있듯이) 나는 스트림에서 데이터를 분리하는 방법을 생각할 수 없습니다.그래서 질문 ..
는 TEST.C 코드를 수정하지 않고 ./test 실행할 때와 같이 출력을 달성하기 위해 nodejs를 사용하는 방법이 있습니까? 터미널 에뮬레이션이나 프로세스 스폰 또는 다른 방법을 사용합니까?건배!
문제 설명에 많은 노력을 쏟아 주셔서 감사합니다! 노드 내에서 다른 사람의 파이썬 스크립트를 실행할 때도 같은 문제가 있었지만 기본 버퍼링 메커니즘에 대해서는 알지 못했습니다. 분명히 (내 파이썬 기술은 +/- 존재하지 않음) 단순히 'python -u'를 사용하면 언 버퍼 드 IO를 활성화하고 내 문제를 해결할 수 있습니다! – Matthias
@gratz이 문제를 해결 했습니까? 나는 비슷한 문제에 직면하고있다. http://stackoverflow.com/questions/42130677/how-to-get-mongo-shell-outputthree-dot-for-unterminated-command –