2010-11-27 52 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的文件分配的另一部分),但我不能鍛鍊如何管串進去。

如果我理解正確的,我需要做的是這樣的:通過標準輸入

FILE * file = popen("/bin/cat", "w"); 
fwrite("hello", 5, file); 
pclose(file); 

其中,我認爲,將執行貓,並通過「打招呼」了進去。這是正確的嗎?

+0

你有沒有運行那第二塊代碼?如果你有,你會意識到,fwrite接受另一個參數,這是你的字符串的一個元素的大小,所以你可能已經試過fwrite(「hello」,sizeof(char),5,file);並發現這確實有效。無論你是否應該這樣做,或者通過調用pipe()然後fork()一個孩子,關閉管道的末端,並用write()和sprintf()發送信息是一個不同的想法。 – prelic 2010-11-27 10:21:58

回答

2

如果你需要得到一個字符串到md5程序,那麼你就需要了解哪些選項你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

試試這個:

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 
} 

如果你真的想將它寫入MD5的標準輸入,然後從MD5的stdout閱讀,你可能會想看看周圍的popen2的實現(.. )。儘管這通常不在C庫中。

+0

對於哪個`md5`程序是這個有效的命令行語法? – 2010-11-27 10:07:57

+0

char * get_string_md5(char * data){ static char command [256]; snprintf(command,256,「md5 -qs'%s'」,data); FILE * md5 = popen(md5,「r」); static char result [256]; (fgets(result,256,md5)){ 返回結果; } printf(「錯誤:無法生成MD5散列\ n」); end(EXIT_FAILURE); } 沒有工作:( – Ash 2010-11-27 10:19:36

+0

@larsmans:它可以在MacOS X 10.6.5上使用/ sbin/md5。 – 2010-11-27 16:58:29

1

見上面我的評論:

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

產生MD5和

相關問題