【发布时间】:2019-02-06 15:44:32
【问题描述】:
我使用 QProcess 打开 /bin/sh 或 /usr/bin/bash,可以将命令写入 shell 并将输出读入我的程序。
实际问题发生在尝试向 shell 发送文本结束控制信号以中止 shell 正在运行的子进程时。
我尝试了什么:
- shell 以
-interactive 模式启动 - 我使用 shell-builtin
set -m命令来启用作业控制 - 出于调试目的,我读出了
$-变量,它似乎是himBHs - 发送任意命令通常有效(例如
ls) - 发送
\x04(传输结束,Ctrl+D)有效并杀死shell。
如何在不再次打开 shell 的情况下适当地终止正在运行的进程?
QProcess process;
process.start("/bin/sh", QStringList() << "-i");
process.write("set -m\necho $-\n"); // returns himBHs
process.waitForBytesWritten();
// start a running program here (E.g. tail -f logfile)
process.write("tail -f logfile\n");
process.write("\x03");
process.write("newcommand\n");
process.waitForBytesWritten();
在 shell 中运行第一个命令会在 stdout 上返回输出,但在发送 ETX 和下一个命令后我不再收到任何内容,尽管 shell 仍在运行 (process.state() == QProcess::Running)
- 是否有更好的方法来发送控制信号或与子进程的子进程通信?
- 如何在不重新打开 shell 的情况下在 shell 中启动新程序? (我问这个的原因是因为程序可能会使用 ssh 作为 shell,我希望它避免为一个小的程序/参数更改重新启动一个全新的连接)
【问题讨论】:
标签: c++ bash qt shell qprocess