我有一个embedded式Linux系统,可以从USB卡更新自己。 接口程序检测USB插入并查找升级的可执行文件。 我目前将其复制到本地文件,并在rc5.d中安装一些命令将文件复制到下一次启动时的现有exe文件。 然后我有软件重新启动。
有一个更好的方法吗?
您不需要在下次启动时复制文件。 相反,这个序列会正常工作:
在unlink()
之后,应用程序将继续运行 – 在所有正在执行的拷贝完成之前,内核不会释放基础数据。
那么你甚至可以使用execve()
来让当前正在运行的进程用新上传的版本替换自己。
在程序运行时替换可执行文件是可以的, 如果你首先解除连接 。
这不是用cp
发生的,所以不要使用它。 无论是mv
文件,还是要确定, rm
,然后把新的文件放在同一个地方。 如果你正在用嵌入式软件中的代码来做这件事,那么unlink(2)
就是你想要的。
Unix内核知道inode仍在使用中,他们将删除该文件的目录项,但是它们不会释放inode(和数据块),直到inode引用计数为零,并且这不会发生它的一个实例正在运行。
这可能不是您的嵌入式系统的问题,但作为一般的警告,除了在服务器本身之外,不要指望它适用于网络存储。
在Linux中,您可以安全地在进程运行时替换正在运行的可执行文件。 只要进程正在运行,该实例将继续使用“旧”代码。 所有对应用程序的新调用都将使用“新”代码。 所以,只需重新启动应用程序(或者如果需要,设备)将使用新的副本。
请注意,如果您的应用程序将更改配置文件或库,那么您必须小心,因为这些可能不驻留在内存中。 在这种情况下,更安全的赌注是让脚本做你所说的。