Linux C进程等到文件副本完成(shell命令)

时间:2018-03-29 06:58:18

标签: linux shell embedded-linux cp

我正在尝试将一个文件夹(Linux SBC)中的多个文件夹和文件从一个进程复制到另一个文件夹(USB挂载文件夹)。

我的过程完全用C编写.linux系统是运行YOCTO的SBC,它没有rsync可用。

我对popenmount等大多数命令使用了umount命令。 但是对于复制(cp命令),我不确定如何等待副本完成。

我在我的C代码中使用以下格式,它可以正常工作(复制工作)

system("yes | cp -rf " USB_DATA_SOURCE_PATH " " USB_DATA_DESTINATION_PATH);

我需要复制多个文件,并且可以有任意数量的具有动态名称的文件。我需要的只是一种方式来了解复制已完成并且对umount是安全的,并向用户表明。

1 个答案:

答案 0 :(得分:1)

正如评论中所暗示的那样:

  1. system()等待cp完成,因此您无需添加任何等待周期。
  2. 但是cp返回复制的数据时,可能不一定已经从缓冲区写入磁盘。您可以明确调用sync来实现此目的。
  3. 但是 umount已经确保缓存被同步/缓冲刷新;这就是为什么有时需要一些时间才能umount返回。
  4. 要将其全部包装起来,synccp之间不需要明确的umount,除非之间还有其他操作,并且您希望确保数据同步当USB磁盘从机器中拉出而未正确卸载时。在这种情况下,您最好的选择是延长system()来电:

    system("yes | cp -rf " USB_DATA_SOURCE_PATH " " USB_DATA_DESTINATION_PATH "; sync");
    

    强制sync独立于复制命令的成功,或

    system("yes | cp -rf " USB_DATA_SOURCE_PATH " " USB_DATA_DESTINATION_PATH " && sync");
    

    如果您需要获取cp的未更改退出代码,以防它失败。