2012-03-21 17 views
0

ネイティブCプログラムでディレクトリのファイルを別のディレクトリにコピーしたいとします。 system機能を使用しようとしましたが機能しません。AndroidのネイティブCコードでシステム関数のcp(Copy)コマンドを使用する方法

Iは、Android

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

のネイティブコードでこのシステム機能をこのコードを試み256(エラーコード)の整数値を返します。つまり、Androidでシステム機能が動作していると言うことができます。 BusyBoxをインストールしたので、cpコマンドも使用できます。

私は直接cp /mnt/test /Download/コマンドを実行するとうまくいきます。

systemの機能に問題があります。私は何かを逃したか?

答えて

1

system()関数は、コマンドプロセッサが使用可能であることを示すためにゼロ以外の値を返します。使用できない場合はゼロを返します。 sys/wait.hに定義されているマクロを使用して戻り値を解析することができます。またシステム()実際にフォーク()を呼び出しシステムコールとEXECL()デフォルト(SH)コマンドinterperterと。したがって、あなたのプログラマーがシステム()を呼び出すとすぐに終了する場合は、waitpid()関数を使用することを検討してください。

+0

ご返信ありがとうございますが、どうすれば私の問題を解決し、私のコードで何が問題になるのか教えてください。 – user1089679

+0

'system'の後に' waitpid'を呼び出す必要はありません。それ自体は – Hasturkun

+0

です。実際に 'system()'は子プロセスが終了するまで戻りません。あなたのコードには明らかな問題は見当たりませんが、 'system()'はエラー時に 'errno'を設定します。あなたはそれを印刷できます(あるいは' strerror() 'を使うこともできます)。 –

0

パスの問題である可能性があります。そのように、busyboxの「CP」コマンドへのフルパスを指定してみてください:

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

私はbusyboxのは、そのファイルを保存する場所はわからない、これだけ変更「/パス/に/ bbdir」あなたの実際のbusyboxを反映しますパス。

+0

私もそれをチェックしました。私は/ system/bin /にインストールされているので、私もフルパスを取る。/system/bin/cp/mnt/test/Download – user1089679

0

あなたの質問は、glibcに "cp"関数呼び出しがないという事実に起因すると思います。

cpを実装するための教科書の例は、通常、バイト単位でコピーを開始し、次にブロックコピーに移り、最後にファイルコピーを実装します。 mmap()を使用します。

シンボリックリンクなどの機能が必要な場合は、コードの複雑さが急増します。

この場合、system()を使いたいかもしれません。 しかし、Androidでは、ビジーボックスが同梱されているシステムはごくわずかです。 ほとんどのシステムには元のAndroidの「ツールボックス」が付属しています。これは、提供するものと実行できるものが非常に限られています。

ところで、 'cp'が動作せず、ビジーボックスがあると確信できる場合は、代わりに '/ bin/busybox cp'を実行してください。

関連する問題