Я предполагаю, что ваш процесс уже имеет в виду такой FD, иначе вы бы спросили, как записать файл или сокет, а не FD. При условии, что это будет работать:
const fs = require('fs');
const fd3 = fs.createWriteStream(null, {fd: 3});
fd3.write("Hello to FD 3!\n");
Это создает новый поток, связанный с FD 3, так же, как process.stdout
связан с FD 1, а process.stderr
связан с FD 2.
Я предполагаю, что ваш FD блокируется (по умолчанию для FD в Linux). Если он по какой-то причине неблокирует, вам нужно либо изменить его обратно на блокировку, либо использовать вместо него net.Socket
.
Если вы запускаете этот код, когда вы этого не сделали дайте ему FD для записи, тогда, вероятно, произойдет что-то плохое:
events.js:292
throw er; // Unhandled 'error' event
^
Error: EINVAL: invalid argument, write
Emitted 'error' event on WriteStream instance at:
at emitErrorNT (internal/streams/destroy.js:96:8)
at emitErrorCloseNT (internal/streams/destroy.js:68:3)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
errno: -22,
code: 'EINVAL',
syscall: 'write'
}
Aborted (core dumped)
Или, может быть, это:
events.js:292
throw er; // Unhandled 'error' event
^
Error: EBADF: bad file descriptor, close
Emitted 'error' event on WriteStream instance at:
at emitErrorNT (internal/streams/destroy.js:96:8)
at emitErrorCloseNT (internal/streams/destroy.js:68:3)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
errno: -9,
code: 'EBADF',
syscall: 'close'
}
Если вы действительно хотите открыть FD с узла , тогда вы можете использовать любые обычные способы открытия файла, чтобы сделать это. Однако вы не можете гарантировать FD 3 в этом случае, поскольку есть большая вероятность, что что-то внутреннее для Node уже использует FD 3, и вы не можете просто выкрасть его из-под него.