将手柄传递到管道中

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(使用前将#替换为@)

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

随机推荐

  • 错误:元素应该是“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 鉴于