console.log
使用process.stdout.write
写入文件描述符(fd) 1
和
console.error
使用process.stderr.write
写入文件描述符(fd) 2
如何创建新的文件描述符3?然后写信给那个人?
更新:使用net
import net from 'net'
const example = new net.Socket({ fd: 3, writable: true })
const buffBaby = Buffer.from('meow', 'utf8')
example.write(buffBaby)
我知道这个错误:
错误: ENOTTY:不适合设备的ioctl,uv_pipe_open
我试过这个:
const fs = require('fs');
const fd3 = fs.createWriteStream(null, {fd: 3});
fd3.write("Hello to FD 3!\n");
错误: ENXIO:没有这样的设备或地址,写
发布于 2020-04-25 23:27:12
我假设您的流程中已经有这样一个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中FDs的默认设置)。如果出于某种原因,它是非阻塞的,那么您需要将其改为阻塞或使用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了,而且您不能仅仅从它下面偷出来。
发布于 2020-04-26 01:07:25
这个问题阻止了我,因为我没有看到任何POSIX或其他syscall可以选择您想要创建的fd号,例如插座和打开 --如果我错了,请纠正我,我想澄清nodejs文档的net.Socket选项,它说:
如果指定了fd:(number),用给定的文件描述符环绕一个现有的套接字,否则将创建一个新的套接字。
这意味着它不会在您选择的fd上创建套接字,相反,它重用现有的套接字,因为性能原因,我认为应该避免创建新的连接,或者与其他线程或使用者共享连接。
最后,请注意fd编号在每个进程域都是唯一的,或者(进程控制块),也就是说,fd的创建从3开始是增量的,因为保留了0、1和2,在此基础上,如果您确实知道打开连接的正确顺序,就可以预测fd号,因为每个打开的连接或套接字或文件都会创建一个连接--如果您不关闭它们的话。
https://stackoverflow.com/questions/61433529
复制相似问题