首页 > 解决方案 > 写入节点中的文件描述符 3

问题描述

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:没有这样的设备或地址,写

标签: node.jsfile-descriptor

解决方案


我假设您的进程已经考虑了这样的 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 1process.stderr相关联并与 FD 2 相关联一样。

我假设您的 FD 处于阻塞状态(Linux 中 FD 的默认设置)。如果由于某种原因它是非阻塞的,那么您需要将其更改回阻塞或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,你不能只是从它下面偷走它。


推荐阅读