gpt4 book ai didi

c - 比使用 System() 调用更简单的方式?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:01:57 24 4
gpt4 key购买 nike

所以我有一段旧的、令人讨厌的 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() 调用中抛出“&”将立即返回,就像如果我从命令行?最后,有没有办法确保将 stderr(甚至可能是 stdout)打印到运行“管理器”的同一终端屏幕?

预先感谢您的帮助。

最佳答案

您需要从服务器获得什么:

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

接收关机消息:

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

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

接收开始消息:

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

接收重启消息:

关闭后跟开始相同。

关于c - 比使用 System() 调用更简单的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19176217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com