【问题标题】:How to use cp (Copy) command in system function in native C code on Android如何在 Android 原生 C 代码的系统函数中使用 cp(复制)命令
【发布时间】:2012-03-21 16:37:25
【问题描述】:

我想在我的本地 C 程序中将文件从一个目录复制到另一个目录。 我尝试使用system 函数,但它不起作用。

我在 Android 的本机代码中尝试了这段代码

int result = system("cp /mnt/test /Download/"); // It's not working

此系统函数返回256(错误代码)整数值。所以我们可以说系统功能在Android中工作。我还安装了 BusyBox,所以我也可以使用 cp 命令。

如果我直接执行cp /mnt/test /Download/ 命令,那么它工作正常。

那么system 函数有什么问题。我错过了什么吗?

【问题讨论】:

    标签: android c linux android-ndk


    【解决方案1】:

    system() 函数返回非零值表示命令处理器可用,如果没有可用的命令处理器返回零。您可以使用 sys/wait.h 中定义的宏来分析返回值。 system() 实际上调用 fork() 系统调用和 execl() 与默认 (sh) 命令interperter .因此,如果您的程序在调用 system() 后立即退出,请考虑使用 waitpid() 函数。

    【讨论】:

    • 感谢您的回复,但请告诉我如何解决我的这个问题以及我的代码中有什么问题。
    • 你不需要在system之后调用waitpid,它会自己做
    • 确实 system() 在子进程结束之前不会返回,我的错。我在您的代码中看不到任何明显的问题,但 system()errno 设置为错误,您可以打印它(甚至使用 strerror())。
    • @well-wisher 感谢您的友好回复让我知道如何在此代码中使用 strerror() 函数来跟踪我在 cp 命令中的错误
    • 只需在system 调用后添加if (errno) perror("system");errno 变量定义在errno.hperror 函数定义在stdio.h
    【解决方案2】:

    可能是路径问题。尝试指定busybox“cp”命令的完整路径,如下所示:

    int result = system("/path/to/bbdir/cp /mnt/test /Download/"); 
    

    我不确定busybox 将其文件保存在哪里,所以只需更改“/path/to/bbdir”以反映您的实际busybox 路径。

    【讨论】:

    • 我也检查了那个。我安装在 /system/bin/ 中,所以我也采用完整路径。 /system/bin/cp /mnt/test /下载
    【解决方案3】:

    我猜你的问题源于 glibc 中没有“cp”函数调用。

    如果您只需要复制文件,只需打开两个文件并开始复制;-) 实现cp的教科书示例通常从逐字节复制开始,然后移动到块复制,最后使用mmap()实现文件复制。

    如果您需要保留符号链接等其他功能,代码的复杂性会迅速增加。

    在这种情况下,可能很想使用 system()。 但是,在 Android 上,只有少数几个系统附带了 busybox。 大多数系统仍然附带原始的 Android“工具箱”。这个在它提供的和可以做的方面非常有限。

    顺便说一句,如果 'cp' 不起作用并且你确定你有busybox,请尝试使用'/bin/busybox cp'。

    【讨论】:

      猜你喜欢
      • 2014-06-23
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多