2012-02-15 20 views
1

私はテストを呼び出すC++コードを持っています。私はこのテストを実行するためにシステムコールを行っています。このテストに失敗すると、次のようなエラーが表示されます。「エラー:次のコンポーネントタイプのデバイスが1つ以上見つかりませんでした。」C++でシステムコールが失敗したときに表示される失敗ログメッセージを読み取る方法は?

Linuxのredhatで実行されるC++コードがあります。システムコールが失敗したかどうかを検出します。しかし、エラーメッセージ(エラー:以下のコンポーネントタイプの1つまたは複数のデバイスが検出されなかった可能性があります:)をキャプチャできず、ログファイルに追加または印刷できません。以下のコンポーネントタイプ(S)の一つまたは複数のデバイス:)発見することができませんでした。

誰かが(ERRORは、エラーメッセージをキャプチャする方法を教えていただけますか? PS:私はインターンです、どんな助けも本当にいいです。

#include<iostream.h> 
int main() 
{ 
    int i; 
    if (system(NULL)) 
    puts ("Ok"); 
    else 
    exit (1); 

    i=system("hpsp --discover -verbose --user Admin --oapasswd password"); 

    printf ("The value returned was: %d.\n",i); 

    return false; 
} 

答えて

4

代わりのsystem()使用popen()を使用。これにより、テストプログラムの標準出力をキャプチャするパイプが開き、プログラムはパイプを介してそれを読み取ることができます。

編集:

#define _BSD_SOURCE 1 
#define BUFFSIZE 400 

#include <stdio.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    char *cmd = "hpsp --discover -verbose --user Admin --oapasswd password"; 

    char buf[BUFFSIZE]; 
    char* searchResult; 
    int testPassed = 0; 

    FILE *ptr; 

    if ((ptr = popen(cmd, "r")) != NULL) 
     while (fgets(buf, BUFFSIZE, ptr) != NULL) 
     { 
      if ((searchResult = strstr(buf, "The test passed")) != NULL) 
      { 
       testPassed = 1; 
       break; 
      } 
     } 

    if (testPassed) 
     printf("yea!!\n"); 
    else 
     printf("boo!!\n"); 

    pclose(ptr); 

    return 0; 
} 
+0

これはstderrではなくコマンドのstdoutをキャプチャします。 stderrが必要な場合は、 '2>&1'のようなシェルリダイレクトを使うことができます.popenはシェルを使ってコマンドを実行します。 –

+0

私はstdoutをキャプチャするだけでなく、自分のシステムコマンドが合格したか失敗したかも知る必要があります。 popen()を使うのが好きですが、私のシステムコマンドが合格したか失敗したかを判断する方法がわかりません。あなたは私にそのことを教えてもらえますか? – usustarr

+0

@usustarr - あなたがpopen()を代わりに使用しているので、system()を実行する必要はありません。私はあなたが探している "合格"結果の文字列の詳細を知らないが、私はそれがどのように行われるかを説明するために答えのコードを編集した。 – Duck

1

あなたのログファイルにリダイレクトするために、標準エラー出力ファイルディスクリプタを保存/バックアップにdupdup2を使用することができます。まあ、私はエラーが標準エラーになると推測しています。あなただけのログファイルに書き込みたい場合はここで

は一例です。

//open log file, choose whatever flags you need 
int logfd = open("whateveryourlogfileis", O_APPEND); 

//back up stderr file descriptor 
int stderr_copy = dup(STDERR_FILENO); 

//redirect stderr to your opened log file 
dup2(logfd, STDERR_FILENO); 

//close the original file descriptor for the log file 
close(logfd); 

//system call here 

//restore stderr 
dup2(stderr_copy, STDERR_FILENO); 

//close stderr copy 
close(stderr_copy); 

注:dup2がそれにINGのdup2前に、対象のファイルディスクリプタをクローズします。 dupはファイル記述子を複製して、新しいファイル記述子を返します。

関連する問題