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 %
なぜ?
を意味していることですが、ループ内で 'numRead == -1'チェックは、* *真になることはありません。ループの後にあるはずですか? –
私は知らない。本の著者は中括弧でプログラムを書いていない、なぜ彼はそれが私を超えていないのですか? – Gala
単一のステートメントでは中括弧は必要ありません。 –