gpt4 book ai didi

javascript - 在 node.js 中,我发送到 stdin 的数据只有在我调用 end() 后才会到达进程。如果我想继续写作怎么办?

转载 作者:行者123 更新时间:2023-11-30 19:20:07 25 4
gpt4 key购买 nike

如果我这样做:

child = child_process.spawn('./resources/backend-exe', {stdio: ['pipe', 'pipe', 'ignore']});
child.stdin.write("Test\n");

子进程没有反应,就好像什么都没有发送给它一样。但是,如果我这样做(添加一行):

child = child_process.spawn('./resources/backend-exe', {stdio: ['pipe', 'pipe', 'ignore']});
child.stdin.write("Test\n");
child.stdin.end();

它像往常一样对数据使用react,并向标准输出发送响应。但是,这意味着我无法再写入流。如果我想写几次怎么办?如何在不关闭流的情况下“刷新”数据?

这是子进程的完整代码(Haskell):

module Main where

main :: IO ()
main = do
line <- getLine
putStrLn line
main

最佳答案

当您调用 .write() 时,数据会在一段时间后自动刷新。
(如果您想知道刷新何时发生,您可以向 .write() 提供回调或监听 drain 事件)

例如:

child.stdin.write("Test\n", () => console.log("FLUSHED!"));

这是两个进程之间的乒乓球的工作示例:repl.it console

如果你想处理你的子进程的输出,将pipe传递给stdio并在stdout上监听data:

const child_process = require('child_process');

child = child_process.spawn('./program', {stdio: ['pipe', 'pipe', 'ignore']});

// listen for messages from our child
child.stdout.on('data', chunk => {
console.log("Child sent line: " + chunk.toString());
});

// send a message to the child
child.stdin.write("Test\n");

(有关完整示例,请参阅 repl.it console)

编辑:您的问题似乎与缓冲有关。Haskell 将检查您的程序是否在 tty 上下文中运行,即程序是否直接连接到控制台,并相应地设置缓冲策略。

如果您从控制台启动您的 haskell 程序,haskell 将使用 LineBuffering。
但是,如果您在非 tty 上下文中调用它,它将使用 block 缓冲。您可以通过调用重置缓冲策略

hSetBuffering stdin LineBuffering
hSetBuffering stdout LineBuffering

使用 LineBufferingNoBuffering 让 haskell 进程再次响应每一行。

关于javascript - 在 node.js 中,我发送到 stdin 的数据只有在我调用 end() 后才会到达进程。如果我想继续写作怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57560605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com