aşağıdaki C programını (test.c) düşünün akışları: stdout'a bir çizgi yazdırmalısınıznode.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);
}
bir çizgi stderr bekletin kullanıcı girişi için, stdout'a başka bir satır ve stderr'e başka bir satır. Çok basit! derlenmiş ve tam (kullanıcı girişi getchar için alınır)() ne zaman komut satırında programın çıktısını çalıştırdığınızda:
$ ./test
string out 1
string err 1
string out 2
string err 2
aşağıdaki kodla nodejs ile çocuk süreç olarak bu programı yumurtlamaya çalışırken :
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);
çıktı gibi görünür:
terminal seçenekleri içinde ./test çalıştırırken görüldüğü gibi çıktı çok farklı$ nodejs test.js
stderr: string err 1
stdout: string out 1
string out 2
stderr: string err 2
l. Bunun nedeni,. /test programının nodejs tarafından oluşturulduğunda etkileşimli bir kabukta çalışmadığıdır. Test.c stdout akışı arabelleğe alınır ve bir \ n'ye ulaşılır ulaşmaz terminalde çalıştırıldığında arabelleği temizlenir, ancak bu şekilde düğümle birlikte oluşturulduğunda arabellek temizlenmez. Bu, her baskıdan sonra stdout'u temizleyerek veya arabelleğe alınacak stdout akışını değiştirerek çözülebilir, böylece her şeyi anında temizler. Test.c kaynağının mevcut olmadığını veya değiştirilemeyeceğini varsayarsak, belirtilen iki yıkama seçeneğinin hiçbiri uygulanamaz.
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);
verir:
$ nodejs test.js
data: string out 1
string err 1
data:
data: string out 2
string err 2
Ancak hem
Sonra örneğin, iyi bir iş pty.js (sözde terminali) var, interaktif bir kabuk taklit bakmaya başladı stdout ve stderr (bir terminalde programı çalıştırırken göreceğiniz gibi) birleştirilir ve verileri akışlardan ayırmanın bir yolunu düşünemiyorum.Yani soru ..
test.c kodunuzu değiştirmeden ./test çalıştırırken görüldüğü gibi sonuç elde etmek için nodejs kullanarak herhangi bir yolu var mı? Terminal emülasyonu veya süreç yumurtlama veya başka bir yöntem ile?Şerefe!
Sorunun açıklamasına büyük miktarda çaba harcadığınız için teşekkür ederiz! Bir başkasının python betiğini düğümünden çalıştırırken aynı problemi yaşadım, ancak temeldeki arabelleğe alma mekaniği hakkında hiçbir şey bilmiyordum. Görünüşe göre (benim python becerilerim varolmayan +/-), sadece 'python -u' kullanıldığında arabelleğe alınmamış IO ve problemimi çözdüm! – Matthias
@gratz Bu problemi çözdünüz mü? Ben benzer bir sorunla karşılaşıyorum. Bunu http://stackoverflow.com/questions/42130677/how-to-get-mongo-shell-outputthree-dot-for-unterminated-command –