在C语言中重启程序

5

您好,我有一个用 C 语言编写的程序。程序中包括全局变量、数组、动态变量等等。当我向程序发送 SIGHUP 信号并在句柄中清理动态内存时,我想通过 HUP 重启程序。有没有办法在 C 语言中重新启动程序?我希望退出并从主函数返回,以便清理由主函数处理的静态数组的内存,然后重新开始执行主函数。

再次问候您。我编辑了信号句柄并在其中添加了 execv。在句柄中,我有两个函数。第一个是 clean_up(),用于清理动态数组;第二个是 execv()。发送 HUP 信号后,首先运行 clean_up(),然后是 execv()。但是不久之后,程序出现了段错误。如果不调用 clean_up() 函数,则程序可以正常工作。cleanup 存在问题吗?但是,例如终止信号等其他信号下,clean_up() 函数能够正常工作。

还有一个关于 execv() 的问题。它不会从主函数开始启动新程序吗?当我调用 execv() 时,它不会再次从主函数开始运行。

2个回答

8

既然你在使用Linux操作系统,我认为这是最干净的方法:

int main(int argc, char **argv) {
    /* your program here */

    /* if you want to restart call this */
    if (execv(argv[0], argv)) {
        /* ERROR, handle this yourself */
    }

    return 0;
}

为什么要复制?为什么不也使用strdup()来复制argv[]的成员呢? - wildplasser
@wildplasser:因为我们需要一个以空字符结尾的数组。 - orlp
1
argv[] 的最后一个成员保证为 NULL。 - wildplasser
在信号处理程序中使用restart_process()时要小心。根据POSIX.1标准,mallocexecv未定义为可重入函数,这意味着当您在信号处理程序中调用它们时可能会发生未定义的事情(例如内部数据结构损坏)。有关更多信息,您可以参考《UNIX环境高级编程》(W. Richard Stevens,Addison-Weseley,1999年第18版,第278页)。 - Andreas Florath
1
如果在调用 execve 前不通过其完整路径运行程序并执行 chdir(SOME_OTHER_DIR_THAN_BEFORE),程序将无法工作。 - JJJ
显示剩余2条评论

1

我假设你正在使用某种形式的Unix系统。这里有一个类似问题的答案here。那段代码只是重新读取配置文件,这是人们期望在sighup时发生的事情,而不是实际的重启。话虽如此,如果你想要重启,只需用exec替换load_config()调用即可。有几个exec调用可供选择,因此请查看exec或execve的man页面以选择你想要的调用。当你执行exec时,你将传递父进程的环境和argv指针以保留它们。

不管怎样,如果你要重新启动程序并预计重新初始化它们,我真的不明白为什么你要清除静态数组。


如果我在程序中声明一个数组 int array[variable]; 然后再次重新初始化这个数组,并且变量发生了改变,那么数组所在的位置不会改变吗? - barp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接