2017-03-27 8 views
3

は形式以下に私のC++のコードでsystem()コールを経由して解凍します。私のシナリオでunzipコマンドが-1を返す原因は何ですか?私は実行

/usr/bin/unzip -o -q /<my_path_to_zip_file>/cfg_T-KTMAKUCB.zip -d /<my_path_to_dest>/../ 

これは時間のほぼ90%が成功します。 -1のリターンコードで何が失敗するのか理解できません。何か案は?

+0

あなたの 'unzip'のバージョンを共有してください。 – arminb

+0

なぜエラーストリームをログファイルにパイプしないのですか?コマンドを100回実行した単位テストを作成し、ログファイルをチェックしてエラーの内容を確認できます。 – Michael

+0

プログラムを呼び出すユーザーは、ディレクトリにアクセスするために必要な権限をすべて持っていますか?ファイルを解凍するのに十分なスペースがデバイスにありますか? 'sudo'でプログラムを走らせると助けになるのですか?また、 'system()'から返された '-1'は' unzip'の戻り値であるとは限りません(詳細は 'man 3 sleep'を参照してください)。いくつかの詳細を教えてください。 – Rogus

答えて

8

そうでない場合、戻り値は-1エラーの私のローカルman system

よる(例えば、フォーク(2)に失敗しました)、及びコマンドのリターン・ステータス。

POSIX spec子プロセスが作成できない場合、またはコマンド言語インタプリタの終了ステータスが取得できない場合は、システム()は-1を返しerrnoに設定するものと、

を語りますエラーを示します

最後に、unzipのマンページにはさまざまな戻りコードがリストされていますが、-1はその中にはありません。

コマンド自体が-1を返すことができない場合は、システム全体またはユーザーごとの制限(メモリが使い果たされている;プロセステーブルがいっぱいで、最大プロセス数、オープンファイルまたはユーザーのVMサイズ制限などなど)。

systemが失敗した場合は、errnoをチェックする必要があります。 strace -fの下で全体を実行すると、何が起こるかも表示されます。

+0

リターンコード-1上の良い点は、最初の 'fork' /' exec'で発生します。私が確かめることのできることは、「メモリが使い果たされた、プロセステーブルがいっぱい、最大プロセス、開いているファイル、またはVMサイズ制限」が原因ではないことです。だから 'strace -f'が何を与えるのだろうか。 – Griffin

関連する問題