我编译了在ARM上作为二进制文件运行的C代码。 ARM使用使用buildroot生成的旧Image
从SD卡引导Linux。在C代码中,我调用一个shell脚本,将我要启动的新Image
从SD卡上的子目录移动到SD卡的顶层(覆盖旧的Image
) ,然后使用备份Image.bak
再次恢复子目录中的Image
,以防我再次运行脚本:
#!/bin/sh
mv /sd/newImage/Image /sd/
mv /sd/newImage/Image.bak /sd/newImage/Image
reboot
在这种情况下,重新启动正常工作(Putty断开连接 - >电路板上的LED我使用红色然后是绿色 - >我可以通过Putty重新连接),尽管第二个mv
命令不会 - 它会移除Image.bak
但不会创建Image
- 但这不是此帖的目的,实际上。
当我尝试修改脚本以便Image.bak
使用Image
命令实际恢复cp
时,重启无法正常工作。
#!/bin/sh
mv /sd/newImage/Image /sd/
cp /sd/newImage/Image.bak /sd/newImage/Image
reboot
我正在使用断开连接的Putty终端会发生什么,但是当发信号通知重启时,电路板上的红色LED指示灯保持绿色状态,通过Putty重新建立连接的唯一方法是手动重启电路板通过电源开关。因此,当我在shell脚本中调用cp
命令时,似乎发生了一些奇怪的事情。我已经尝试卸下SD卡,认为可能存在同步问题,但这也没有用。
我以root身份登录,权限不应该是任何问题。
答案 0 :(得分:2)
首先,这实际上是一个系统问题,而不是一个编程问题,所以它应该可能在另一个堆栈中。
其次,这很可能是图像实际上是文件系统中其他地方的符号链接的结果。使用cp
时,它将替换链接指向的内容。当您使用mv
时,它会将此文件放入符号链接的位置,但会将原始文件保留在其实际位置。
要验证这一点,只需使用ls -l /sd
并记下Image
的文件类型(属性中的第一个字符)。