CLI命令到运行过程

CLI Commands to a running process

本文关键字:过程 运行 命令 CLI      更新时间:2023-10-16
  1. GDB如何实现将自己附加到运行过程的壮举?

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

  3. 是否有一个可以为运行过程提供CLI通信能力的库,并且可以扩展到自定义命令?

该过程本身是用C

编写的

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

您是否考虑在过程中使用AF_UNIX插座?还是D-Bus?或使其成为HTTP服务器(例如使用Libonion或libmicrohttpd),也许是用于肥皂或RCP/XDR

阅读一些有关高级Linux编程或高级UNIX编程的书籍;您肯定想(也许是间接)一些多路复用的SYSCALL(例如民意调查(2)),也许是某些事件的libary之类的libev。也许您想为此专用一个线程。

我们不能不知道您在想什么样的过程。您可能需要重新设计其中的一部分。如果该过程是一些传统的计算密集型功能,则与SMTP服务器过程不同。特别是,如果您在此过程中有一些事件循环,请使用&将其扩展以进行监视。如果您没有任何事件循环(例如,在传统的数字处理"批处理"应用程序中),则可能需要添加一个。

在这种情况下,我建议'fork',将当前运行的过程分为两个。父进程将读取stdin,处理命令并能够处理两个过程之间共享的所有内存。从理论上讲,甚至可以跳过 crespocess communication 的高级形式:锁,静音,信号量,信号,套接字或管道 - 但要准备好 child child 过程不一定要编写它陈述内存,但将其保存在寄存器中。

在叉子操作系统上,该过程副本本地变量,然后每个过程都有自己的内部状态 - 因此,传递数据的最简单方法是分配"共享内存"。

一个人还可以将信号处理程序写入儿童过程,该过程进入睡眠/等待状态,并且仅在另一个信号上退出 - 这样,一个人可以有更多时间检查子过程内部状态。这种方法的主要理由是,不必在调试中进行调试的过程中必须进行调试:父和子进程共享相同的代码库,这足以让父母进程实现必要的输出方法(格式化格式化)屏幕?)并序列化数据等。