#node.js #stream #file-descriptor #child-process
#node.js #поток #файловый дескриптор #дочерний процесс
Вопрос:
fs.createReadStream()
И fs.createWriteStream()
поддерживают только пути к файлам, но мне нужно прочитать (или записать) из файлового дескриптора (переданного дочернему процессу / из него).
Обратите внимание, что мне нужны потоки, поэтому fs.open/fs.read/fs.write
их недостаточно.
Ответ №1:
Когда вы вызываете fs.createReadStream, вы можете передать файловый дескриптор:
var fs = require('fs');
var fd = fs.openSync('/tmp/tmp.js', 'r');
var s = fs.createReadStream(null, {fd: fd});
s.pipe(process.stdout);
Если есть fd
опция, имя файла игнорируется.
Комментарии:
1. Отлично! Я обнаружил, что обратное также работает с
fs.createWriteStream(null, {fd: fd});
. Странно, это не задокументировано в руководстве, но работает как по волшебству.2. Если вы внимательно посмотрите документ, на который я ссылался, вы увидите, что на это, по крайней мере, есть намек в документах, хотя я признаю, что нашел это в исходном коде. 🙂
3. Да, но все другие методы fs имеют специальные версии для файловых дескрипторов. Я заметил параметр fd, но ничто не указывает на то, что вы могли бы использовать null в качестве пути. Странно это.
4. Вам нужно передать пустую строку, подобную этой,
fs.createReadStream('', {fd: fd})
вместоnull
.5. LOL «смотри внимательно»
Ответ №2:
// Open amp;3:
process.oob1 = fs.createWriteStream(null, { fd: 3 });
// Write to amp;3 / oob1 (out-of-band 1)
process.oob1.write("Note: this will throw an exception without 3>amp;1 or something else declaring the existence of amp;3");