CLI对正在运行的进程的命令

时间:2012-10-25 04:39:54

标签: c++ linux

  1. GDB如何实现将自身附加到正在运行的过程中的壮举?

  2. 我需要类似的功能,我可以在其中向正在运行的进程发出CLI命令。例如,我可以查询进程内部状态,例如show total_messages_processed?如何构建支持在linux下向正在运行的进程发出命令?

  3. 是否有可以为正在运行的进程提供CLI通信功能的库,并且可以为自定义命令进行扩展?

  4. 该过程本身是用c ++编写的

3 个答案:

答案 0 :(得分:3)

GDB不使用CLI与其debugee进行通信;它使用ptrace系统调用/ API。

CLI表示“命令行界面”。流程之间最简单的沟通形式是stdin / stdout。这是通过管道实现的。例如:

ps -ef | grep 'httpd'

ps的标准输出(将是一个流程列表)连接到grep的标准输入,后者将逐行处理该流程列表输出。

您是在编写这两个程序,还是想要与已有的流程进行通信?我不知道“show total_messages_processed”的意思是没有上下文。


如果您只是希望程序传达某种状态,那么dd采用的方法就是:发送SIGUSR1信号的过程会导致它将当前的统计信息转储到stderr并继续处理:

$ dd if=/dev/zero of=/dev/null&
[1] 19716
$ pid=$!
$ kill -usr1 $pid
$ 10838746+0 records in
10838746+0 records out
5549437952 bytes (5.5 GB) copied, 9.8995 s, 561 MB/s

答案 1 :(得分:2)

您是否考虑在流程中使用AF_UNIX套接字?还是D-bus?或者将其设为HTTP服务器(例如,使用libonionlibmicrohttpd),可能是SOAPRCP/XDR

Advanced Linux ProgrammingAdvanced Unix Programming上阅读一些书籍;你肯定想要(可能间接地)使用某些多路复用系统调用,例如poll(2),或许比某些事件库更像libev。也许你想为此专门设一个主题。

如果不知道你在考虑什么样的过程,我们就无法说出更多。您可能需要重新设计它的某些部分。如果该进程是某些传统的计算密集型事物,则它与SMTP服务器进程不同。特别是,如果您在此过程中有一些事件循环,请使用&将其扩展用于监控目的。如果您没有任何事件循环(例如,在传统的数字处理“批处理”应用程序中),您可能需要添加一个。

答案 2 :(得分:0)

在这种情况下,我建议' fork&#39 ;,它将当前正在运行的进程分成两部分。父进程将读取stdin,处理命令并能够处理两个进程之间共享的所有内存。理论上甚至可以跳过进程间通信的高级形式:锁,互斥体,信号量,信号,套接字或管道 - 但要准备好进程不一定写入& #39; s状态到内存但将其保存在寄存器中。

在fork操作系统中创建进程局部变量的副本,之后每个进程都有自己的内部状态 - 因此传递数据的最简单方法是分配"共享内存"。

还可以为子进程编写一个信号处理程序,进入 sleep / wait state 并仅退出另一个信号 - 这样就可以有更多的时间来检查子进程内部国家。这种方法的主要原理是,没有必要让调试过程意识到被调试:父进程和子进程共享相同的代码库,对于父进程来说它足够了实现必要的输出方法(格式化为屏幕?)和序列化数据等。