首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在节点中写入文件描述符3

在节点中写入文件描述符3
EN

Stack Overflow用户
提问于 2020-04-25 22:39:26
回答 2查看 895关注 0票数 3

console.log使用process.stdout.write写入文件描述符(fd) 1

console.error使用process.stderr.write写入文件描述符(fd) 2

如何创建新的文件描述符3?然后写信给那个人?

更新:使用net

代码语言:javascript
运行
复制
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

我试过这个:

代码语言:javascript
运行
复制
const fs = require('fs');
const fd3 = fs.createWriteStream(null, {fd: 3});
fd3.write("Hello to FD 3!\n");

错误: ENXIO:没有这样的设备或地址,写

EN

回答 2

Stack Overflow用户

发布于 2020-04-25 23:27:12

我假设您的流程中已经有这样一个FD,否则您将询问如何写入文件或套接字,而不是FD。如果是这样的话,这将是可行的:

代码语言:javascript
运行
复制
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的情况下运行该代码,那么可能会发生这样的情况:

代码语言:javascript
运行
复制
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)

或者这个:

代码语言:javascript
运行
复制
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了,而且您不能仅仅从它下面偷出来。

票数 2
EN

Stack Overflow用户

发布于 2020-04-26 01:07:25

这个问题阻止了我,因为我没有看到任何POSIX或其他syscall可以选择您想要创建的fd号,例如插座打开 --如果我错了,请纠正我,我想澄清nodejs文档的net.Socket选项,它说:

如果指定了fd:(number),用给定的文件描述符环绕一个现有的套接字,否则将创建一个新的套接字。

这意味着它不会在您选择的fd上创建套接字,相反,它重用现有的套接字,因为性能原因,我认为应该避免创建新的连接,或者与其他线程或使用者共享连接。

最后,请注意fd编号在每个进程域都是唯一的,或者(进程控制块),也就是说,fd的创建从3开始是增量的,因为保留了0、1和2,在此基础上,如果您确实知道打开连接的正确顺序,就可以预测fd号,因为每个打开的连接或套接字或文件都会创建一个连接--如果您不关闭它们的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61433529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档