2016-07-22 102 views
0

因此,我正在關注一個過時的書(2010),並試圖用Linux系統調用複製文件。這是我有:複製文件失敗,EBADF關閉輸出文件描述符

注:忽略tlpi_hdr.herror_functions.h,他們定義errExit()fatal()和一些吡唑類,他們只是打印錯誤並退出。

#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) 

這裏你是比較outputFd爲值-1。其結果是一個布爾值,在C中將是01。這恰好是標準輸入或標準輸出,具體取決於結果。不是您應該關閉的描述符文件。

我的猜測是,你的意思是

if (close(outputFd) == -1)