2010-11-27 15 views
4

私はcで多かれ少なかれuniで作業しています。文字配列からMD5を生成する必要があります。この割り当てでは、パイプを作成してシステム上でmd5コマンドを実行する必要があることを指定しています。Cでpopen()コマンドに文字列をパイプする方法は?

FILE *in; 
extern FILE * popen(); 
char buff[512]; 

/* popen creates a pipe so we can read the output 
* of the program we are invoking */ 
char command[260] = "md5 "; 
strcat(command, (char*) file->name); 
if (!(in = popen(command, "r"))) { 
    printf("ERROR: failed to open pipe\n"); 
    end(EXIT_FAILURE); 
} 

は今、これは(ファイルのMD5を取得する必要が割り当ての別の部分のために)完璧に動作しますが、私はそれにどのようにパイプ文字列トレーニングをカント:

私はこれまでのところ得ています。

私が正しく理解していれば、私のような何か実行する必要があります。

、私が思うに、猫を実行し、STDINを通して、そこに「hello」を渡す
FILE * file = popen("/bin/cat", "w"); 
fwrite("hello", 5, file); 
pclose(file); 

を。これは正しいですか?

+0

あなたが実行しましたその2番目のブロックコード? fwrite( "hello"、sizeof(char)、5、file)を試したと思われるので、fwriteが文字列の要素のサイズである別のパラメータを受け取ることに気づくでしょう。これが実際に機能することを発見しました。このようにしなければならないかどうか、またはpipe()とfork()の呼び出し、パイプの終わりの閉じ、write()とsprintf()を使った情報の送信は別の考えです。 – prelic

答えて

2

を生成し、その後、あなたはあなたのmd5プログラムがでどのような作品のオプションを知る必要があります。それは、コマンドラインで明示的に文字列を取る場合

  • 、その後、それを使用:

    md5 -s 'string to be hashed' 
    
  • をファイル名をコマンドラインに指定されていない場合、それは標準入力を要する場合には、使用します。

    echo 'string to be hashed' | md5 
    
  • それは絶対ファイル名を主張し、あなたのシステムが/dev/stdinまたは/dev/fd/0をサポートし、使用している場合:

    echo 'string to be hashed' | md5 /dev/stdin 
    
  • 上記のいずれにも該当しない場合は、あなたは、ディスク上のファイルを作成する必要があり、それにmd5を実行し、その後、ファイルを削除します:

    echo 'string to be hashed' > file.$$; md5 file.$$; rm -f file.$$ 
    
+0

+1として戻す必要があります。そのシステムによっては、プログラムが 'md5sum '。 –

0

この試してみてください:あなたは本当にMD5の標準入力に書き込み、その後、MD5の標準出力から読み込みたい場合、あなたはおそらくたpopen2の実装(のために見て回るしたいとしている。..

static char command[256]; 
snprintf(command, 256, "md5 -qs '%s'", "your string goes here"); 
FILE* md5 = popen(md5, "r"); 
static char result[256]; 
if (fgets(result, 256, md5)) { 
    // got it 
} 

を)。しかし、通常はCライブラリにはありません。

+0

'md5'プログラムはこの有効なコマンドライン構文ですか? –

+0

char * get_string_md5(char * data){ static charコマンド[256]; snprintf(コマンド、256、 "md5 -qs '%s'"、データ); FILE * md5 = popen(md5、 "r"); static char result [256]; if(fgets(結果、256、md5)){ リターン結果; } printf( "エラー:MD5ハッシュを生成できませんでした\ n"); end(EXIT_FAILURE); } doesnt work :( – Ash

+0

@larsmans:MacOS X 10.6.5で利用可能な/ sbin/md5で動作するでしょう。 –

1

を参照してください上記の私のコメント:あなたはmd5プログラムに文字列を取得する必要がある場合は

FILE* file = popen("/sbin/md5","w"); 
fwrite("test", sizeof(char), 4, file); 
pclose(file); 

はMD5サム

+0

これで、私は正しいトラックのようなものでした。 – Ash

+0

どうしたらいいですか?文字列BACK - 現時点では、あなたのコードは動作しますが、それは画面に表示されます - 私はそれを 'char *' – Ash

関連する問題