将手柄传递到管道中

2023-12-07

说我有

node foo.js | node bar.js

有没有办法将 foo 的标准输入句柄传递给 bar.js?

我有一个罕见的情况,我想在管道中进行向后通信。

至少我知道我可以发送node bar.js的pidnode foo.js。鉴于 pid,在 *nix 上,我应该能够使用以下命令写入 foo 的标准输入:

/proc/<pid>/fd/0

但有没有办法在 MacOS 上做同样的事情呢?


所以有不同的方法可以做到这一点。

方法 1 - IOCTL

这是灵感来自

https://stackoverflow.com/a/36522620/2830850

所以你创造了writevt.c包含以下内容的文件

/*
 * Mostly ripped off of console-tools' writevt.c
 */

#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <unistd.h>

char *progname;

static int usage() {
    printf("Usage: %s ttydev text\n", progname);
    return 2;
}

int main(int argc, char **argv) {
    int fd, argi;
    char *term = NULL;
    char *text = NULL;

    progname = argv[0];

    argi = 1;

    if (argi < argc)
        term = argv[argi++];
    else {
        fprintf(stderr, "%s: no tty specified\n", progname);
        return usage();
    }

    if (argi < argc)
        text = argv[argi++];
    else {
        fprintf(stderr, "%s: no text specified\n", progname);
        return usage();
    }

    if (argi != argc) {
        fprintf(stderr, "%s: too many arguments\n", progname);
        return usage();
    }

    fd = open(term, O_RDONLY);
    if (fd < 0) {
        perror(term);
        fprintf(stderr, "%s: could not open tty\n", progname);
        return 1;
    }

    while (*text) {
        if (ioctl(fd, TIOCSTI, text)) {
            perror("ioctl");
            return 1;
        }
        text++;
    }

    return 0;
}

使用下面的方法编译它

gcc -o writevt writevt.c

然后加root相同的许可

sudo chown root:wheel writevt
sudo chmod 4755 writevt

现在我创建了一个简单的foo.js用下面的代码

var stdin = process.openStdin();

stdin.addListener("data", function(d) {
    console.log(process.env.NAME + " entered: [" +
        d.toString().trim() + "]");
});

首先在终端中运行tty command

$ tty
/dev/ttys019

现在运行如下代码

NAME=A node foo.js  | NAME=B node foo.js

现在从另一个终端运行以下命令

./writevt /dev/ttys019 "FROM external command^M"

^M这是CTRL+V + CTRL+ENTER on Mac

Content

正如你可以看到gif输入达到stdinA 的内容,然后 A 在 stdout 上打印,然后由 B 接收。所以如果我修改如下代码

var stdin = process.openStdin();

stdin.addListener("data", function(d) {
    console.log(process.env.NAME + " entered: [" +
        d.toString().trim() + "]");
});

if (process.env.NAME === "B") {
    setInterval(function() {
        require('child_process').exec(`./writevt /dev/ttys019 "Hello from B?
"`)
    }, 1000)
}

Note 1: ^M在上面的代码中使用 Vim 添加

Note 2:TTY 位置已被硬编码于此,但您可以通过运行以下命令将其通过环境变量传递

export TTY=`tty`

然后使用process.env.TTY在代码中。更新后的结果是

Working

方法 2 - FIFO 文件

在这种方法中,您首先创建一个 fifo 文件

$ mkfifo nodebridge

现在你改变你的代码如下

var stdin = process.openStdin();
var fs = require("fs")
stdin.addListener("data", function(d) {
    console.log(process.env.NAME + " entered: [" +
        d.toString().trim() + "]");
});

if (process.env.NAME === "B") {
    setInterval( () => {
        require('child_process').exec('printf "Hello from B?\\n" > nodebridge')
    }, 1000);
}

并运行如下命令

NAME=A node foo.js < nodebridge | NAME=B node foo.js

NodeBridge

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将手柄传递到管道中 的相关文章

  • 如何为我的整个 Node.js 应用程序使用相同的 MySQL 连接?

    我有一个app js 我从那里运行我的整个应用程序 在 app js 内部 我require许多文件中都有代码 对于每个文件 我都这样做 var mysql require mysql var mclient mysql createCon
  • 尝试安装 LESS 时出现“请尝试以 root/管理员身份再次运行此命令”错误

    我正在尝试在我的计算机上安装 LESS 并且已经安装了节点 但是 当我输入 node install g less 时 出现以下错误 并且不知道该怎么办 FPaulMAC bin paul npm install g less npm ER
  • 如何在查询语句之外从mysql查询中获取值?

    这是下面的函数console log function quo value value connection query SELECT role from roles where id 1 function error results fi
  • Git 2.2.x 无缘无故更新旧包文件的时间戳

    Git 2 2 0 和 2 2 1 似乎修改了旧的时间戳 git objects pack pack pack偶尔会无缘无故地文件 它只是改变时间戳 内容是相同的 调试这一点很困难 因为它似乎很少进行更改 我在 2 2 0 之前的任何 Gi
  • Node.js http get 请求错误事件未拾取 404 或 403

    我正在对图像发出 HTTP GET 请求 有时图像会以 404 或 403 的形式返回 令我惊讶的是 我必须明确检查这一点 而不是在错误事件中选择它 这是它的工作原理还是我在这里遗漏了一些东西 function processRequest
  • 沙箱中的 Nodejs

    我使用 NodeJS 作为客户端浏览器和服务器之间的中间人来处理所有请求 我正在尝试使用 nodejs 作为过滤工具并突出显示 如果不是 所有恶意脚本 但我意识到nodejs让脚本以当前环境权限运行 因此 我决定通过安装沙箱在新的上下文中运
  • Chrome/Firefox 在后台发送两个 POST,间隔恰好 5 秒,仅调用一次来获取 Nodejs 8.0.0 服务器

    注意 这不是飞行前选项 也不是网站图标或其他类似内容 实际上是 2 个帖子 下面有一个屏幕截图可以更清楚地显示这一点 我的规格 版本 macOS 塞拉利昂版本 10 12 3 Chrome 版本 61 0 3128 0 官方版本 开发版 6
  • 由于 Chrome 修订,Firebase puppeteer PDF 功能超时

    我有一个 Firebase 函数来创建 PDF 文件 最近 由于 Chrome 修订版 而超时 我既不明白错误消息 也不明白出了什么问题 当我在 MacOS 下将其本地部署时 该功能有效 TimeoutError Timed out aft
  • 如何设置上传的文件名?

    By using multer I made it to request image file like this 这个文件存储在我设置的 上传 文件夹中 我的代码如下 var multer require multer var uploa
  • NestJS e2e 测试模拟会话装饰器

    我正在尝试使用 supertest 编写一个 e2e 测试 其中我的控制器实际上使用了 Session 装饰师 然而 我不想承担使用数据库连接等启动会话的全部负担 因此测试中的我的应用程序实际上并未初始化会话 相反 我想首先模拟掉装饰器提供
  • Codesign:什么是未密封内容?

    我刚刚升级到 XCode 6 并尝试构建我的开发者 ID 签名的 Mac 应用程序 但是 我现在收到以下协同设计错误 unsealed contents present in the root directory of an embedde
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 在 Node.js 中,setTimeout() 会阻止事件循环吗?

    如果我有一个简单的 setTimeout 函数 并将其设置为 10 秒 整个服务器在那10秒内就死机了 这是真的 这就是我听到的 答案是no 你的链接是什么Node js 如何重新创建 setTimeout 函数而不阻塞事件循环 https
  • 如何使用对象数组创建猫鼬模式

    我有这个 json data id 1 name Sample test description this is a sample test category tests points 100 startDate 2018 02 15 00
  • 在node.js中加载并执行外部文件

    从另一个节点js文件运行一个节点js文件是否容易 可能 例如 我有两个文件 test1 js 和 test2 js 我想从 test2 js 执行 test1 js 文件 我认为完成你想做的事情的更好方法是按照我的其他答案建议的去做 但是要
  • 具有 Firebase (FCM) 推送通知的 Node js

    我正在使用 Node js 开发 REST api 并且有一个休息端点来发送 firebase 推送通知 我的代码如下 const bodyParser require body parser var cors require cors v
  • 通过 node-http-proxy 保留基于 cookie 的会话

    我有一个简单的基于 Express 的 Node js Web 服务器 用于开发 JavaScript 应用程序 我将服务器设置为使用 node http proxy 来代理应用程序向在不同域和端口上运行的 Jetty 服务器发出的 API
  • 流星内存不足

    我正在使用流星来制作报废引擎 我必须执行一个 HTTP GET 请求 这会向我发送一个 xml 但这个 xml 大于 400 ko 我得到一个异常 内存不足 result Meteor http get http SomeUrl com 致
  • 如何在 OSX 上安装 numpy 和 scipy?

    我是 Mac 新手 请耐心等待 我现在使用的是雪豹 10 6 4 我想安装numpy和scipy 所以我从他们的官方网站下载了python2 6 numpy和scipy dmg文件 但是 我在导入 numpy 时遇到问题 Library F
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的

随机推荐

  • 错误:元素应该是“select”,但却是“a”

    当我尝试从下拉列表中选择一个选项时 我收到错误 元素应该是 选择 但却是 a 下面是我的源代码 WebElement element dr findElement By id m1tlm0 Select select new Select
  • 使用函数接口抽象公共代码的问题

    在这里我实现了以下两个功能 如下所示 Output1 computeFirst Input1 input String lockName input getId LockItem lockItem acquireLock lockName
  • 计算已售库存/股票的利润/资本收益

    我有一个 Google 表格 适用 Excel 公式 其中包含 2000 笔交易 其结构如下 链接到 Google Sheet 其中包含示例计算 我需要计算每个卖单的利润 即先进先出资本收益 并将该金额放入第五列 如图所示 这可以通过传统公
  • 为 clion 配置 SFML (Windows)

    我正在我的 Windows 计算机上为学校项目设置工作环境 我们将使用 C 和 CLion 制作一个基本游戏 为了制作游戏 我需要使用 SFML 库 我已经遵循了一些教程 但我似乎无论如何都无法让它工作 I have 下载 CLion 并使
  • 为什么Python请求无法解析TikTok API数据?

    我正在使用请求库向 TikTok 发出 Python 请求 我设法挖掘出他们的用户详细信息的 URL 我不知道这是否合法 如果不合法 请告诉我 当我尝试将其解析为 json 时 它会引发异常 有人可以帮我解析 修复这个问题吗 这是代码 Py
  • 计算一个字母在一个单词中出现的次数

    我有一句话describe 我想看看每个字母在单词中出现了多少次 例如 e 出现两次 d 出现一次等等 我努力了 for letter map str seq describe count re seq letter describe 但我
  • 如何使用更少的 import 语句导入 Java 中的多个类? [复制]

    这个问题在这里已经有答案了 我对在 Java 中使用包还很陌生 我想知道是否有一种更简单的方法来使用更少的 import 语句导入类 我正在使用处理并且我已经开始使用用于处理的 Box2D创建一些游戏 为了使用该库 我必须将以下内容添加到我
  • 为什么这个表达式的计算结果为 0?

    为什么表达 5 lt 3 lt 1 在 MATLAB 中计算结果为 0 每个单独的语句都评估为 true 所以我很困惑为什么它的评估结果为 false 因为它实际上看起来像这样 5 lt 3 lt 1 5 1 最终答案 0
  • 实施 UserDefaults 时遇到问题

    我以前有编码经验 但对 Swift 和 iOS 都非常陌生 我正在开发一款供个人使用的应用程序 以将我用来帮助管理多动症的多个不同应用程序的功能合并到一个地方 该应用程序的主视图提供了一种跟踪日常支出的方法 我正在尝试使用 UserDefa
  • 检查模型与两个不同物体之间是否同时发生碰撞

    在 VR Unity 项目中工作 尝试编写一些 C 脚本 我的角色模型有两只脚 在 VR 中使用跟踪器进行控制 我需要一种方法来找出双脚何时与立方体碰撞 同时 左脚使用立方体 A 右脚使用立方体 B 这样我就可以在满足条件时生成另一个对象
  • 直观地区分自动生成的文件?

    我们有一堆根据数据库模型自动生成的文件 我有过一些捂脸的经历 因为我修改了一些代码 却发现我的修改被覆盖了 因为我没有注意到我的更改在那些生成的文件中 因此 我修改了生成器以在文件头中包含 请勿修改 注释 这有帮助 不过 在跟踪方法调用时
  • 使用 count() 和 first() 时,iPython 笔记本中的 PySpark 会引发 Py4JJavaError

    我在 iPython 笔记本 python v 3 6 中使用 PySpark v 2 1 0 而不是在我的 Mac Sierra 10 12 3 Beta 中使用 virtualenv 1 我通过在终端中拍摄启动了 iPython 笔记本
  • JSON 有效时 JSON 输入意外结束

    我正在使用 Express 从公共 API 获取数据并在前端使用这些数据 这是我的字符路由 它在某些公共 API URL 上运行良好 但我尝试的大多数结果都会出现意外的输入错误结束 我也收到了Unexpected token in JSON
  • 如何使用 Meteor.loginWithGoogle 获取 Google+ 个人资料?

    我正在寻找 Meteor loginWithGoogle 的工作示例 使用meteor 0 6 4 1 我找到了这个用于 loginWithGitHub 的 https www eventedmind com posts meteor cu
  • 我需要在 ios 8 中实现可扩展的 tableView 单元格

    In my project I need to implement the UITableview with some of the tableView cells are expandable and some of them are i
  • htaccess 无法在 iis 上运行

    如何将 htaccess 转换为 web config 我刚刚知道我需要使用 web config 而不是 htaccess 请在下面找到我的 htaccess RewriteEngine On RewriteBase RewriteCon
  • PIL - 在图像上绘制多行文本

    我尝试在图像底部添加文本 实际上我已经做到了 但如果我的文本比图像宽度长 它会从两侧剪切 为了简化 我希望文本在多行中 如果是 比图像宽度长 这是我的代码 FOREGROUND 255 255 255 WIDTH 375 HEIGHT 50
  • 如何使用C#从Excel文件中读取数据[重复]

    这个问题在这里已经有答案了 我的应用程序需要从 Excel 文件读取数据 我使用 Net 和 c 进行开发 我无法在系统中安装MS Office 因此 我的应用程序无法读取 excel 文件 并在加载 excel 的 dll 时抛出错误 如
  • 如何恢复已推送到远程的合并提交?

    git revert
  • 将手柄传递到管道中

    说我有 node foo js node bar js 有没有办法将 foo 的标准输入句柄传递给 bar js 我有一个罕见的情况 我想在管道中进行向后通信 至少我知道我可以发送node bar js的pidnode foo js 鉴于