2012-05-13 16 views
0

CプログラムでLinuxコマンドを実行し、プログラム内でこのコマンドから(解析)stdoutを読み込みたいです。以下のコードは動作しますが、コマンドの実行時間を制限する方法と、文字列とバイトの読み取り制限にはわかりません。何か案は?パイプされたプログラムの実行時間を制限する

FILE *ps_pipe; 
int bytes_read; 
int nbytes = 100; 
char *my_string=NULL; 
char message[1024]; 
message=sprintf(message,"any command here"); 
ps_pipe = popen (message, "r"); 
my_string = (char *) malloc (nbytes + 1); 
bytes_read = getdelim (&my_string, &nbytes, "delimiter_word", ps_pipe); 
pclose(ps_pipe); 
free(my_string); 
+0

[アラーム](http://www.mkssoftware.com/docs/man3/alarm.3.asp)はあなたの友達です。 –

+0

パイプを閉じるか、ただ閉じます。子プロセスはEPIPE/SIGPIPEで終了します。 – wildplasser

+0

@DavidSchwartz私はアラームを使用し、それは動作しますが、私はアラームハンドラ内pcloseがグローバルVARであり、唯一のオープンとのfreadと他の関数で使用されているファイルディスクリプタ、と正しく実行されません理由を知りません。 – risque

答えて

0

これはselect()で行うことができます。 Selectは、イベントが発生する(読み取り可能、書き込み可能、​​...)ように1つ以上のファイル記述子で「待機」することができます(オプションのタイムアウトを使用)。ファイル記述子で動作するため、fileno(ps_pipe)も必要です。

しかし、popenは子プロセスの特定の詳細を隠すので、forkしたプロセスを簡単に終了することはできません。このような制御が必要な場合は、より低いレベルの関数fork()、pipe()、dup()、exec()、wait()およびkill()を使用する必要があります。

関連する問題