2011-11-13 8 views
3

私はcからbashコマンドを実行しようとしており、結果を取得して表示しています。 私はシステムで試しましたが動作しません。 私のコードは次のようになります:Cでbashコマンドを実行して出力を取得する方法は?

char command[200]; 
sprintf(command,"lsof -iTCP:%d | cut -d\"\" -f1 | tail -1",port); 
printf("Port %d is open\n and is listened by %s",port,system(command)); 

助けてください。私はこれを必要とする 。

+0

は、私が実行しようとしている – sehe

+0

bashコマンドを起動しようとしているあなたが実際にはないことは明らかであるように再フレージング問題を検討し、実際には(C++から)特定のポートでリスニングプロセスを見つけたいですbashコマンド。ポートを聞いているサービスを見つけられない –

+0

これをクリアしてくれてありがとう、 – sehe

答えて

5

編集はさておき、実際の質問から、私は

sudo netstat -tlpn 

を使用していると思います(ポート/アドレスを解決しませ、TCPポートでリッスンしているプロセスを示している)

おそらくそれを組み合わせますgrepのビットで:

sudo netstat -tlpn | grep :7761 

ポート:7761が聴かれている場所を見つけるには?


popenを使用できます。

popenを使用すると、プロセスの出力が非同期的に受信されるという利点があります(サブプロセスが完了するのを待たずに応答が出力の最初の行にある場合は処理を停止できます;単にpcloseとサブプロセスSIGPIPEで死ぬ)

Standards Documentationからサンプル:

次の例では、取得するためにコマンドls *を実行するpopen()pclose()の使用方法を示しカレントディレクトリ内のファイルのリスト:

#include <stdio.h> 
... 


FILE *fp; 
int status; 
char path[PATH_MAX]; 


fp = popen("ls *", "r"); 
if (fp == NULL) 
    /* Handle error */; 


while (fgets(path, PATH_MAX, fp) != NULL) 
    printf("%s", path); 


status = pclose(fp); 
if (status == -1) { 
    /* Error reported by pclose() */ 
    ... 
} else { 
    /* Use macros described under wait() to inspect `status' in order 
     to determine success/failure of command executed by popen() */ 
    ... 
} 
+0

速いですか?私はたくさんのポートをスキャンします。 –

+1

@Baden Sorin - あなたはbashシェルと3つの他のプログラムを、関連するすべての配管と共に起動します。これらの配管はすべてメモリに持ち込み、実行し、最後にもう一度解凍する必要があります。いいえ、「速い」ではありません。あなたがやっていることによっては、「十分に速い」かもしれませんが、そうでない場合は、「シェルからデータを戻す」という問題ではなく、「シェルコマンドを実行する」部分にあります。あなたがより速く必要な場合は、砲撃することなくこれを行う方法を見つける必要があります。 –

+0

@Michael Kohne問題は、特定のポートをリッスンしているサービスを取得する必要があることです。 –

1

システム(コマンド)コマンドのリターンコードではなく、その出力を返します。 コマンドの出力を読み取る場合は、popen を使用する必要があります。これは出力にファイルディスクリプタを返します。ファイルディスクリプタは通常のファイルと同様に読み取ることができます。

+0

それはseheの答えだった。 –

関連する問題