gpt4 book ai didi

java - java中的后台进程监听stdin

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:28 24 4
gpt4 key购买 nike

我必须制作一个 java 程序,当用户输入 0 时它应该退出。用 Java 代码编写没问题。

int cmd = read();
System.out.println("got command : " + cmd);
if (cmd == 48) { // ASCII code for 0
System.exit(0);

我想在 Linux 中使用启动-停止脚本来运行这个过程。我也可以使用 &nohup

来做到这一点
case "$1" in    
'start')
if [ -f myfifo ]; then
rm myfifo
fi
mkfifo myfifo
cat > myfifo &
echo $! > myfifo-cat-pid
java -jar myjar.jar >/dev/null 2>&1 0<myfifo &
echo "Started process: "$!
;;

'stop')
echo 0 > myfifo
echo "Stopped process: "
rm myfifo
;;
esac

我的问题是,只要我运行这个进程,它就会读取输入 -1。当我想从 stdinput 读取一些东西时,明确地回显它,即调用 stop 。只是我需要一个由 shell 脚本显式关闭的程序。我已经很努力了。帮助我。

编辑:

我只想在用户按下 q 或任何此类事件时关闭程序,而不希望代码出现无限循环。如果可能,任何其他方法(如收听其他事件)也会有所帮助。我的代码不应该轮询事件。我已经尝试过 Jnotify 监视目录并在该目录中创建或删除文件时引发事件。但运气不好,他们不支持 SunOS。 :(

最佳答案

好吧,事实上 fifo 文件的行为似乎与您想象的不完全一样。

read() 命令未在管道上阻塞。你应该循环直到你得到数据:

    try {
bis = new BufferedInputStream(System.in);
while (true) {
byte[] buffer = new byte[4096];
if (bis.available() > 0) {
bis.read(buffer, 0, bis.available());
// do some clever thing
} else {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} catch (IOException e) {
// it failed...
}

这将尝试读取,如果没有任何内容,它将等待 50 毫秒。

M.

关于java - java中的后台进程监听stdin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11643693/

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