2012-12-27 11 views
5

私はファイル1.txt2.txtを作成し、1.txtに内容を書きます。
次に、以下のコードを使用してコンテンツを2.txtにコピーします。
しかし、動作しません。 2.txtには何もありません。sendfileはファイルの内容をコピーしません

私の間違いを説明できますか?あなたが書きたい2つ目は、あなたから読み込みたいファイルディスクリプタであるに

int main() 
{ 
    int fd1 = open("1.txt",O_RDWR); 
    int fd2 = open("2.txt",O_RDWR);   
    struct stat stat_buf ; 
    fstat(fd1,&stat_buf); 
    ssize_t size = sendfile(fd1,fd2,0,stat_buf.st_size); 
    cout<<"fd1 size:"<<stat_buf.st_size<<endl; //output 41 
    cout<<strerror(errno)<<endl; //output success 

    close(fd1); 
    close(fd2); 
    return 0; 
} 
+0

これは、 'C' タグ付けされたが、はっきりとC++のストリームを使用しています。これをしないでください。 – unwind

+0

C++に移行しました。 ;) –

+0

私はLinuxのC APIを使っているので、 "sendfile"なので、 "C"を作成しました。そして私はこれに注意を払うでしょう。ありがとう! – Tengchao

答えて

5

manによると、署名がそう

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

で、最初のパラメータはファイルディスクリプタであります。

だから、あなたの呼び出しは次のようになります。sendfileプロトタイプを1として

ssize_t size = sendfile(fd2,fd1,0,stat_buf.st_size);

+0

'sendfile'の' fd2'と 'fd1'の順序を逆にする必要があります。 – banuj

+1

意味のある変数名を使用した方がはるかに明確になります。例えば。 in_file、out_fileは、それらが間違った方向にあることを見分けるのがはるかに簡単です。 –

+0

OK、このような簡単な間違い、ありがとう! – Tengchao

0

、あなたが書きたいためのFDは1つが二番目のパラメータである必要があり読み込み、そこから最初のパラメータとFDでなければなりません。しかし、あなたはそれをまったく逆の方法で使いました。

だから、あなたのsendfile文は以下のようにする必要があります:

ssize_t size = sendfile(fd2,fd1,0,stat_buf.st_size); 
関連する問題