正如标题所述,我希望能够在从 bash 脚本执行时向 C++ 程序发送信号、警报、消息或其他内容。我见过一些解决方案,其中脚本将使用参数启动程序,但我需要它在程序已经启动并运行时发生。有什么办法可以做到这一点吗?基本上,当脚本在后台运行时,如果发生错误,我希望将其直接报告给程序,而不是记录在操作系统中的某个位置。我使用的是红帽8。
谢谢
答案1
发送信号:
kill -s signal -- pid_of_your_app
signal - 是要发送的信号。它可以作为名称或数字给出。
发送数据:
echo "text_message" | your_app
或者
cat file | your_app
| - 是管道,它将把一个命令的标准输出发送到程序的标准输入
更新:
关于信号处理,您的应用程序需要处理信号,因为默认情况下它只会退出(您可以为除kill(9)之外的任何信号分配处理程序) https://en.cppreference.com/w/cpp/utility/program/signal
#include <csignal>
void signal_handler(int signal);
// Install a signal handler
std::signal(SIGINT, signal_handler);
答案2
您可以调整接收程序,使其在启动时创建具有众所周知的路径名的 fifo(命名管道),并在退出时删除该 fifo。通常,您让接收方也打开相同的 fifo 进行写入,这使其保持打开状态:没有写入程序的管道往往会将 EOF 通知给读取方。
它可以定期轮询 fifo 中的数据,而不会在没有数据时陷入等待。我不做 C++,但在 C 中你只需标记 fifo O_NONBLOCK —— C++ 将有一些类似的机制。
然后任何其他进程都可以检查 fifo 是否存在(因此它知道有一个活动的读取器),并向其发送一些接收者可以理解的文本。
如果你更喜欢线程而不是阻塞,你可以有一个单独的线程来读取阻塞fifo,并在线程机制内进行同步。
信号的一个问题是您需要识别接收者的 pid。使用 fifo 提供了稳定的命名方法。
编辑:原型设计解决方案,允许任意数量的客户端通过命名管道向服务器发送消息,并具有可靠的启动和关闭条件。缺点是,它在 Bash 中:客户端 40 行,服务器 65 行。