Как использовать команду cp (Copy) в системной функции в родном коде C на Android - PullRequest
0 голосов
/ 21 марта 2012

Я хочу скопировать файл из одного каталога в другой в моей родной C-программе. Я пытался использовать функцию system, но она не работает.

Я попробовал этот код в нативном коде Android

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

Эта системная функция возвращает целое значение 256 (код ошибки). Таким образом, мы можем сказать, что системная функция работает в Android. Я также установил BusyBox, чтобы я мог также использовать команду cp.

Если я выполняю напрямую cp /mnt/test /Download/ команду, то она работает нормально.

Так в чем же проблема в функции system. Я что-то пропустил?

Ответы [ 3 ]

1 голос
/ 21 марта 2012

system () функция возвращает ненулевое значение, чтобы указать, что командный процессор доступен, или ноль, если ни один не доступен.Вы можете использовать макросы, определенные в sys / wait.h , для анализа возвращаемого значения.Также system () на самом деле вызывает fork () syscall и execl () со стандартным ( sh ) командным интерпретатором.Поэтому, если ваша программа завершает работу сразу после вызова system () , попробуйте использовать функцию waitpid () .

0 голосов
/ 22 марта 2012

Полагаю, ваш вопрос связан с тем, что в glibc нет вызова функции "cp".

Если вам нужно только скопировать файлы, просто откройте два файла и начните копирование ;-) Примеры из учебников по реализации cp обычно начинаются с побитовой копии, затем переходят к блок-копированию и, наконец, реализуют копию файла с помощью mmap ().

Если вам нужны другие функции, такие как сохранение символических ссылок и т. Д., Код быстро усложняется.

В этом случае может быть заманчиво захотеть использовать system (). Однако на Android есть только несколько систем, которые поставляются с busybox. Большинство систем по-прежнему поставляются с оригинальной «панелью инструментов» для Android. Этот очень и очень ограничен в том, что он предоставляет и может делать.

Кстати, если «cp» не работает и вы уверены, что у вас есть busybox, попробуйте вместо этого «/ bin / busybox cp».

0 голосов
/ 21 марта 2012

Может быть проблема пути.Попробуйте указать полный путь к команде busybox "cp", например так:

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

Я не уверен, где busybox хранит свои файлы, поэтому просто измените "/ path / на / bbdir", чтобы отразить вашфактический путь busybox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...