【问题标题】:Interrupt a running c++ program from another program or terminal从另一个程序或终端中断正在运行的 c++ 程序
【发布时间】:2015-11-23 21:59:09
【问题描述】:

我编写了一个具有无限循环的 c++ 程序。我想在 linux 中将这个程序作为 daemon(或 service)运行。

我想从程序外部(例如控制台或其他程序)与这个正在运行的守护进程通信。

我阅读了有关 C++ 中的信号处理,显然有一些预定义的信号。有什么方法可以将自己的信号发送给正在运行的程序?

【问题讨论】:

  • SIGUSR1SIGUSR2 就是为此目的。您不能定义自己的任意信号编号。
  • 要获得完美匹配的答案,您可能应该定义 communicate 的确切含义。
  • @Daniel 我想发送一些消息来编程和处理它们。例如,我有一个配置文件,我希望运行的程序在每次更改时都加载它。

标签: c++ service daemon signal-handling


【解决方案1】:

您可以在一个进程中使用kill(pid, signal) 向另一个进程发送信号。发送 SIGKILL 将猛烈地立即终止您的进程。

信号仅限于它们所表达的内容 - 您可以通过访问信号手册的第 7 页了解这一点。有些信号可以被忽略/处理/阻止,而另一些则不能。

如果您想要真正的自定义进程间通信,您应该使用管道甚至套接字(不好的做法)。这样一来,您就必须定义自己的协议,而且您可以做的比信号多得多。

这里有一个关于如何使用命名管道向正在运行的进程发送数据的教程:http://www.linuxjournal.com/content/using-named-pipes-fifos-bash

【讨论】:

  • 管道不太适合控制恶魔进程。
  • @πάνταῥεῖ 我没有暗示。我只是提出了一种更灵活的信号替代方案。
  • OP 在他们的问题中提到了这一点。我也看不出你为什么要调用使用套接字“不好的做法”..
  • @πάνταῥεῖ 用于进程间通信的套接字仅适用于想要实现类似 RPC 的协议,否则它们就过分了。
  • 为了与恶魔进程通信,我主要使用配置文件和inotify()
【解决方案2】:

信号很可能不是您真正想要与恶魔进程通信的东西,除非您想以特定方式终止它。

同样不,您不能定义自己的任意信号编号,因为操作系统需要知道它们是如何发送到进程的。正如我在评论中提到的,SIGUSR1SIGUSR2 用于用户定义的信号目的。

让外部进程与恶魔进程通信的最简单方法是给它一个配置文件,并让恶魔使用inotify() 接口监视变化。

许多系统恶魔也已经使用了这种技术。

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2012-02-25
    • 2020-12-30
    • 2011-10-17
    • 2013-07-07
    • 2010-11-30
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多