我假设你的程序已经有了这样一个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是阻塞的(在Linux中FD的默认设置)。如果由于某种原因它是非阻塞的,那么您需要将其改回阻塞状态或使用net.Socket
。
如果您在没有给它写入FD的情况下运行该代码,那么可能会发生类似于以下的糟糕事情:
events.js:292
throw er;
^
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;
^
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,而你不能将其窃取。