1

所以我有一段旧的、讨厌的 C 代码,我在这个项目中从一位已经转向更绿色牧场的软件工程师那里继承下来。好消息是……它运行了!更好的消息是它似乎没有错误。

问题是它被设计为在服务器上运行,并在命令行上输入一组启动参数。现在,有一个新的要求,即该服务器是可重新配置的(没有看到那个...)。基本上,如果服务器通过 UDP 接收到命令,它要么启动这个程序,要么停止它,或者用通过 UDP 端口传入的新启动参数重新启动它。

基本上,我正在考虑用来运行混淆程序的代码是这样的(抱歉,我面前没有实际的源代码,现在是上午 12:48,我无法入睡,所以我希望伪-下面的代码就足够了):

//my "bad_process_manager"

int manage_process_of_doom() {
  while(true) {
    if (socket_has_received_data) {
      int return_val = ParsePacket(packet_buffer);
      // if statement ordering is just for demonstration, the real one isn't as ugly...
      if (packet indicates shutdown) {
        system("killall bad_process");  // process name is totally unique so I'm good?
      } else if (packet indicates restart) {
        system("killall bad_process");  // stop old configuration
        // start with new parameters that were from UDP packet...
        system("./my_bad_process -a new_param1 -b new_param2 &");
      } else {  // just start
        system("./my_bad_process -a new_param1 -b new_param2 &");
    }
  }
}

因此,由于我必须进行 system() 调用,我想知道是否有一种更简洁的方法可以在没有所有 system() 调用的情况下这样做。我想确保我已经用尽了所有可能的选项,而不必打开 C 文件。我担心实际操作所有这些值会导致不得不重写我继承的整个文件,因为它从未被设计为在程序运行时可配置。

此外,在启动进程方面,我是否正确假设在 system() 调用中抛出“&”将立即返回,就像我从命令行运行该行时我会重新控制终端一样?最后,有没有办法确保标准错误(甚至可能是标准输出)被打印到“管理器”正在运行的同一个终端屏幕上?

在此先感谢您的帮助。

4

1 回答 1

1

您需要从服务器获得的信息:

理想情况下,您控制的服务器进程应该创建某种 PID 文件。同样理想的是,只要该服务器进程仍在运行,它就应该对 PID 文件持有排他锁。这使我们可以知道 PID 文件是否仍然有效或服务器是否已死亡。

接收关机消息:

尝试锁定PID文件,如果成功,你就没有什么可杀的了(服务器已经死了,如果你继续杀,你可能会杀错进程),只需删除旧的PID文件。

如果锁定失败,读取 PID 文件并对 PID 执行kill(),删除旧的 PID 文件。

接收开始信息:

你需要fork()一个新进程,然后选择你喜欢的exec()来启动新的服务器进程。服务器本身当然应该重新创建它的 PID 文件并锁定它。

接收重启消息:

Shutdown后跟Start相同。

于 2013-10-04T08:35:08.977 回答