如何让程序自行重启? (Linux进程)
Posted
技术标签:
【中文标题】如何让程序自行重启? (Linux进程)【英文标题】:How to make a program to restart itself? (Linux process) 【发布时间】:2012-01-08 07:04:15 【问题描述】:我正在尝试让我的程序自行重启,但似乎没有任何效果。我尝试使用fork()
,但在杀死 the parent
进程后 the child
也被杀死了。
代码
void sigup_handler(int signum)
int pid = fork();
if (pid == 0)
execve("prog2", NULL);
else
kill(getpid(), SIGTERM);
int main()
puts("Program 2 started.");
signal(SIGHUP, sigup_handler);
sleep(50);
puts("Program 2 terminated.");
return 0;
【问题讨论】:
【参考方案1】:如果您只是要去kill
parent
,为什么还要打扰fork
?只需执行exec
。该程序的新实例仍将是相同的进程,但将有效地重新启动。
【讨论】:
它输出程序 2 已启动。程序 2 开始。用简单的 execve("prog2", NULL);这让我很困惑。它不应该显示“程序2终止”吗? 它永远不会调用“程序 2 终止”,因为父进程已经用 kill(getpid(),...); 终止了自己; 好的,那么。不管怎样,这条消息很容易通过将它放在一个进程保证终止的地方来实现。 请注意,旧进程映像的文件描述符将保持打开状态!【参考方案2】:使用 2 级分叉。一个家长“监控”应用程序,它分叉孩子并监控他们的状态。如果一个孩子死了,监视器就会启动一个新的。然后孩子们自己分叉做他们必须做的任何事情。
但是,如果您不需要应用程序的“新”副本与被杀死的应用程序具有相同的状态,那么使用 exec() 开始一个新的独立副本可能是一个更好的选择,可以节省您的时间必须有那个监视器副本。
【讨论】:
【参考方案3】:您可以使用daemon(3) 后跟execve(2)
【讨论】:
您介意提供简单的代码来演示使用吗? 这当然是我所做的,但没有取得多大成功:***.com/q/51654668/1098603以上是关于如何让程序自行重启? (Linux进程)的主要内容,如果未能解决你的问题,请参考以下文章