2016-07-22 13 views
0

私はLinuxのシステムコールでファイルをコピーしようとしています。これは私が持っているものです。ファイルのコピーに失敗しました。出力ファイル記述子を閉じるときにEBADFが発生しました。

注:tlpi_hdr.hを無視し、error_functions.h、彼らはerrExit()fatal()を定義し、いくつかのotheres、彼らは単にエラーを表示して終了します。

#include <stdio.h> 
#include <fcntl.h> 

#include "lib/tlpi_hdr.h" 
#include "lib/error_functions.h" 

#ifndef BUF_SIZE 
#define BUF_SIZE 1024 
#endif 

int main(int argc, char *argv[]) 
{ 
    int inputFd, outputFd, openFlags; 
    mode_t filePerms; 
    ssize_t numRead; 
    char buf[BUF_SIZE]; 

    if (argc != 3 || strcmp(argv[1], "--help") == 0) { 
     usageErr("%s old-file new-file\n", argv[0]); 
    } 

    inputFd = open(argv[1], O_RDONLY); 

    if (inputFd == -1) { 
     errExit("Opening file %s", argv[1]); 
    } 

    openFlags = O_CREAT | O_WRONLY | O_TRUNC; 
    filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; 

    outputFd = open(argv[2], openFlags, filePerms); 

    if (outputFd == -1) { 
     errExit("Opening file for writing %s", argv[1]); 
    } 

    while ((numRead = read(inputFd, buf, BUF_SIZE)) > 0) { 

     if (write(outputFd, buf, numRead) != numRead)) 
      fatal("I/O Error"); 

     if (numRead == -1) 
      fatal("Reading error"); 

    } 

    if (close(outputFd == -1)) 
     errExit("close input"); 
    if (close(inputFd == -1)) 
     errExit("close output"); 

    return EXIT_SUCCESS; 
} 

私はEBADF Bad file descriptorと、出力ファイルディスクリプタのクローズに失敗しています:

thinkpad :: ~/.tlpi % ./cp.o a b                                     
ERROR [EBADF Bad file descriptor] close output 

ファイルのコピー罰金カントー:

thinkpad :: ~/.tlpi % sha1sum a                                 
40a925a93e149ac53d2630cde8adeb63b8134b29 a 
thinkpad :: ~/.tlpi % sha1sum b                                     
40a925a93e149ac53d2630cde8adeb63b8134b29 b 
thinkpad :: ~/.tlpi % 

なぜ?

+0

を意味していることですが、ループ内で 'numRead == -1'チェックは、* *真になることはありません。ループの後にあるはずですか? –

+0

私は知らない。本の著者は中括弧でプログラムを書いていない、なぜ彼はそれが私を超えていないのですか? – Gala

+0

単一のステートメントでは中括弧は必要ありません。 –

答えて

3

はのは、あなたのcloseコールを詳しく見てみましょう:

ここ
close(outputFd == -1) 

あなたが値-1outputFdを比較しています。結果はブール値で、Cでは0または1のいずれかになります。これは、結果に応じて、標準入力または標準出力のいずれかになります。あなたが記述したファイルではなく、閉じる必要があります。

私の推測では、あなたの問題に関係のない

if (close(outputFd) == -1) 
関連する問題