2016-05-11 34 views
0

私は、sha1sumプログラムを実行するために子プロセスを使用しています。いくつかのコンテキストでは、基本的にsha1sumはファイルを取得し、独自のコードを作成します。 (これは正確ではありませんが、それは本当に重要ではありません)。 コード長は40文字です。パイプから文字列への読み込み中に文字列全体が読み取られない

私の子プロセスはそれを実行し、親プロセスはコードを保存してバッファに入れます。 私はそれが私が望むことをしていたかどうかをテストするための主要な機能を構築しました。私は文字列が完全ではないことに気付きました。私はそのmallocの問題を考えています。私はなぜそれが思うのかというコードにコメントしました。

char* getN(char *name){ 
int fd[2],pid; 
char *buffer = (char*)malloc(41*sizeof(char)); 

pipe(fd); 
pid=fork(); 

if(!pid){ 
    close(fd[0]); 
    dup2(fd[1],1); 
    close(fd[1]); 
    execlp("sha1sum","sha1sum",name,NULL); 
} 
else{ 
    close(fd[1]); 
    read(fd[0],buffer,sizeof(buffer)); /* if i change this sizeof to like sizeof(buffer)+2 it prints 2 more chars than it previously did. no clue why. */ 
    close(fd[0]); 
    wait(NULL); 
} 
return buffer; 
} 



int main(){ 
    char *a=getN("file.pdf"); // file that's in my current directory. 
    printf("%s\n",a); 
    return 0; 
} 

ありがとうございます。

+0

'sizeof(buffer)'の 'printf'文のように、' buffer'のサイズが実際にどのようになっているかチェックしましたか? –

+0

ループで文字を1つずつ読んだり、一度にすべてを読んだりしてみてください。 – Nevado

答えて

1

バッファは静的な配列ではなく、ポインタであるため、sizeof(バッファ)はポインタのサイズを返します。 (32ビットアーキテクチャでは4、64ビットでは8)。あなたが読み込みを呼び出すとき、あなたはポインタのサイズを望まないので、あなたが指しているデータのサイズを必要とするので、引数としてmallocに渡したのと同じ値を渡す必要があります(この場合、 41)。

+0

私はsizeofに問題があると思ったので、それが私が試した最初のものです。問題はそれが私に奇妙な結果を与えることです。それはこれを返す:2ff7d93c1f79afd6a0f63c90f1ca2bbbc0645995 \ O ?? の代わりに2ff7d93c1f79afd6a0f63c90f1ca2bbbc0645995 – ohiohai

+1

'read()'はヌルターミネーターを追加しないので、データの末尾に追加する必要があります。 'read()'は読み込んだバイト数を返し、そのバイトの後ろにnullを加えます。 – Barmar

+0

@ohiohaiまた、EOFを取得するまでループ内で 'read()'を呼び出す必要があります。単一の呼び出しがすべてを返すという保証はありません。 – Barmar

関連する問題