所以我有一段旧的、讨厌的 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() 调用中抛出“&”将立即返回,就像我从命令行运行该行时我会重新控制终端一样?最后,有没有办法确保标准错误(甚至可能是标准输出)被打印到“管理器”正在运行的同一个终端屏幕上?
在此先感谢您的帮助。