2017-11-19 5 views
0

read(),、およびopen()を使用してファイルを新しいディレクトリにコピーする際に問題があります。私はopen()で新しいファイルを作成することができ、write()で端末に書き込むことができましたが、私はintファイルディスクリプタをオープンからライトに渡すと、指定したファイルに書き込みを行うという前提でした。ファイルをコピーするopen()、read()、write()システムコールの使用

さらに、ファイルを開くと、アクセス権はすべてファンキーで、rootとしてしか開くことができません。私がファイルを作成するたびに、それは完全に空ですが、私が読み込んだファイル全体が端末でプリントアウトされているのがわかります。

システムコールごとにmanファイルを読みましたが、まだ問題が何かを把握していません。問題を修正しました

void *scanFile(s_request *request) 
{ 
    //TODO Print out all struct variables. 
    pthread_mutex_lock(&mutex); 

    int readFileReference; 
    int writeFileReference; 
    int bufferSize = request->bufferSize; 
    int numberOfBytesRead = bufferSize; 
    int *buffer[bufferSize]; 

    if ((readFileReference = open(request->file, O_RDONLY)) == -1) 
    { 
     printf("Failed to open file. Aborting.\n"); 
     exit(EXIT_FAILURE); 
    } 

    if ((writeFileReference = open("newfile.txt", O_CREAT | O_APPEND | O_RDWR) == -1)) 
    { 
     printf("Failed to open write file. Aborting.\n"); 
     exit(EXIT_FAILURE); 
    } 

    while ((read(readFileReference, buffer, numberOfBytesRead)) != 0) 
    { 
     write(writeFileReference, buffer, bufferSize); 
     bzero(buffer, bufferSize); 
    } 

    pthread_mutex_unlock(&mutex); 
} 

更新コード:あなたはこの行に間違った括弧を持って

void *scanFile(s_request *request) 
{ 
    //TODO Print out all struct variables. 
    pthread_mutex_lock(&mutex); 

    int readFileReference; 
    int writeFileReference; 
    int bufferSize = request->bufferSize; 
    int numberOfBytesRead = bufferSize; 
    int *buffer[bufferSize]; 

    if ((readFileReference = open(request->file, O_RDONLY)) == -1) 
    { 
     printf("Failed to open file. Aborting.\n"); 
     exit(EXIT_FAILURE); 
    } 

    if ((writeFileReference = open("newfile.txt", O_CREAT | O_WRONLY, 0777)) == -1) 
    { 
     printf("Failed to open write file. Aborting.\n"); 
     exit(EXIT_FAILURE); 
    } 

    while ((read(readFileReference, buffer, numberOfBytesRead)) != 0) 
    { 
     write(writeFileReference, buffer, bufferSize); 
     bzero(buffer, bufferSize); 
    } 

    close(writeFileReference); 
    close(readFileReference); 

    pthread_mutex_unlock(&mutex); 
} 
+2

「オープン」のドキュメントを読んでいませんでした。ファイルを作成するには* 3つの引数が必要です。 –

+0

そうです。ありがとう@ZanLynx –

答えて

2
if ((writeFileReference = open("newfile.txt", O_CREAT | O_APPEND | O_RDWR) == -1)) 

は、ここに私のコードです。 (これはreadFileReferenceライン上の正しいです。)何をしたいです:

if ((writeFileReference = open("newfile.txt", O_CREAT | O_APPEND | O_RDWR)) == -1) 
                     ^^^ ^^^ 

その行のあなたのオリジナルバージョンは、次にwriteFileReferenceにその比較の結果を割り当て、-1との比較を行い、open()を呼んでいました。さらに

  • コメントに斬Lynxので述べたように、あなたはファイルを作成するときにopen()に権限値を渡す必要があります。通常は0666が正しい - ファイルを読み取り/書き込み可能なファイルとして作成します。 (プロセスのumaskで修正ですので、一般的な設定の下で0644としてファイルを作成してしまいます。)あなたはどこかreadからの戻り値を保存し、(writeに3番目の引数としてそれを渡す必要があり

  • bufferSizeの代わりに)。それ以外の場合、プログラムは読み込まれたバイト数より多くのバイトを書き込みます。小さなファイルをコピーするとき

  • 技術的には、戻り値をwrite()から確認する必要があります。 read()のように、呼び出されるたびに完全な書き込みを完了することは保証されません。 (実際には、通常のファイルを扱うときは、書き込みを完了するかエラーを返しますが、これはそうでない場合があります)。

  • bzero()バッファからの書き込み後。

+0

素晴らしい、ありがとう!そして、コードを追加しながらそれを解決しました。 –

関連する問題