为什么c语言不支持热更新？
热更新？C语言不支持热更新？你怎么理解热更新？ Ksplice、kpatch、kGraft、livepatch ……之类的都不算么？ 我下面这样的又算什么？ 编译执行： 动态替换mytest执行时的printf函数： 编译为动态库后再次执行mytest： 类似这样的手段又算不算热更新呢？ 更新： 我本来只是随便回答一下，没想到点赞没有多少，评论倒是挺热闹的[手动捂脸]。其实评论区很多朋友说的没错，从过程来看，上面的例子确实是让进程终止后重新运行了，所以不能算作完全的热更新，最多算半热更新（在通信领域我们提到双工通信的时候也有全双工和半双工之分），毕竟其还是省去了修改重新编译主程序代码的过程。这其实就和Linux内核的可加/卸载的模块差不多，在不需要重启内核的情况下让一部分驱动程序更新。其实我上面也没有说我那是完全的热更新，我即使在最后也是以疑问句结尾，我只是试图通过一个简单的例子来让读者思考，他们口中的热更新到底是什么。 如果说完全的热更新是让进程不终止的情况下实现代码运行时的改变，那么我还是以dlsym为例，修改一下我的用法，如下： 首先我在主程序中使用dlsym: 为了让程序不退出，我使用一个while循环。这个主程序很简单，就是不停的执行testfunc()函数。然后我定义testfunc()如下，将其放入一个库文件中： 我们编译主程序和库文件，并将库文件放入动态链接库的常规目录下： 然后我们让主程序执行起来： 现在我们修改库文件，将其改为： 然后重新编译库文件，替换原来的库文件位置： 注意这里我并没有中断主程序的执行，我们回到主程序执行的窗口查看，看看它的运行情况，如下： 我们看到主程序在没有终止的情况下运行过程变了。 这样又算不算热更新呢？ 其实“热更新”这个词我一直觉得没有一个明确的定义，很多时候厂商都管自己的更新或者修复叫热更新/热修复。比如一些游戏厂商将仅需服务器端更新不用客户端变动的叫热修，一些游戏在发布初期，你联网和不联网玩简直是两个世界，装备参数完全不一样（说多了都是泪）。其实热修复我觉得更象是一个从用户使用效果来看的名字，只要我的更新让用户那边感觉不到“停滞”或大范围的停滞，差不多就可以算热更新。而从技术角度来看，热更新是一种内存中运行代码的替换，这种替换有的是需要手动重载的，有的可以做到无缝重载（其实越“无缝”，要求和适用条件也越苛刻）。 我觉得读到这里的人也不必纠于与我上面的例子到底该算什么，有这个时间不如研究一下其背后的原理，研究一下一个运行的程序在内存中的状态和分部，了解了之后就能对"更新"运行时程序有新的认识了，至少不会问出“C语言为什么不支持热更新”这种问题了。怎么做你不知道你可以研究，但是从原理都不能先判断出可行不可行那就离研究怎么做差了几层的知识了。