2016-09-15 6 views
0

広範な計測ソフトウェアでtar.gz -archiveを作成するには、次のコードスニペットを使用します。いくつかのデータをいくつかのファイルに収集した後、後で使用するためにアーカイブし圧縮したいと考えています。 シェルからプログラムを起動すると、すべて正常に動作し、すべてのデータが収集され、正しくアーカイブされます。C++プログラムからtar.gz-archiveを作成できない

ただし、組み込みLinuxシステムのシステム起動後にプログラムを自動的に起動する必要があります。 /etc/init.dのスクリプトで開始された場合、戻り値0を取得しても、データファイルはアーカイブ/圧縮されません。さらに、tar.gzファイルが作成されますが、空です。 他のすべてが正常に動作しています。

誰でも説明してください、この特別な自動スタートの特別な場合はどうすればいいですか?

int returnValue = -1; 
std::string jobString = RESULT_PATH; 
jobString += "/"; 
jobString += lastJobString; 
std::string jobFiles = lastJobString + "*.*"; 

std::string cmd = "tar cvf - "; 
cmd += jobFiles; 
cmd += " | gzip > "; 
cmd += jobString; 
cmd += ".tar.gz"; 

std::cout << "archiving and compressing " << jobFiles << ": " << cmd << std::flush << std::endl; 

returnValue = system(cmd.c_str()); 

std::cout << "archiving and compressing finished. Code: " << returnValue << std::flush << std::endl; 

は、私が使用するなどlibarchivelibtar、のようなシステムコマンドを発射するほど怠け者ではない、いくつかのlibrariersがあることを知っているが、私は、これは私の場合のために動作しない理由を知っていただきたいと思います。

また、私の忙しい箱にあるtarのバージョンは、オプションzをサポートしていません。

+2

時には、スクリプトからプログラムを起動するときに、すべてのパスが設定されているわけではないので、 '/ bin/tar'のように絶対パスを使用する必要があります。あなたの '.tar.gz'ファイルは、'> '演算子を使用しているときに常に作成されます。これは、エラー時に空のファイルを作成します。 stderrをログファイルにリダイレクトして、エラーメッセージを表示することもできます。また、手動でgzipを起動してstdoutをファイルにリダイレクトすることなく、単に 'tar czf archive.tar.gz filenames'を使うこともできます。 –

+0

@Karsten Koopあなたの答えに感謝します。私が言及したように、私は呼び出しから戻り値としてエラーを取得しません。さらに、私のビジーボックスの 'tar'のバージョンにはオプション' z'がありません。 – bushmills

+0

Return 0は、コマンドが実際に実行されたことを意味しません。 システム( "blabla 123 | gzip> out")でも、ちょうど試したときに0が返されます。 – Ming

答えて

-1

私はようやく私の問題のため、多分、システムのコマンドがデーモンによって呼び出されたすべてのケースのための解決策を見つけた:

トリックは、コマンドshで新しいシェルを作成し、前にカレントディレクトリを変更することですタール関数は、

std::string cmd = "sh -c \" cd "; 
cmd += SOURCE_DIR; 
cmd+= " && tar cvf - "; 
cmd += jobFiles; 
cmd += " | gzip > "; 
cmd += jobString; 
cmd += ".tar.gz"; 

returnValue = system(cmd.c_str()); 

と呼ばれます。これは他のユーザーが同じ問題に向かうのに役立ちます。

+0

ほとんどの 'tar'プログラム(と確かに[GNU tar](https://www.gnu.org/software/tar/)...)は、ディレクトリを変更するために' -C'プログラムオプションを受け入れます。また、C++プログラムで[chdir(2)](http://man7.org/linux/man-pages/man2/chdir.2.html)を呼び出すこともできます。 –

+0

@Basileこのヒントのおかげで。 – bushmills

+1

あなたのシステムコマンドは脆弱で安全ではありません:悪意のあるユーザーが 'sourceDir'を' rm -rf $ HOME'に設定するとどうなりますか? [コードインジェクション](https://en.wikipedia.org/wiki/Code_injection)にご注意ください! –

関連する問題