C/Linux

[C] copy_file() 구현하기

김호록님 2023. 1. 3. 19:32

copy_file() 함수 구현하기

  • 파일을 복사하여 사본을 생성하는 copy_file()함수를 구현하라.
  • low level function, 즉 open(), read(), write(), close()를 이용하여 구현하라.
  • 단, hole이 있는 경우에도 복사할 수 있어야 한다.

Prototype

int copy_file(const char *src, const char *dst);
  • src는 원본 파일의 이름이다.
  • dst는 사본 파일의 이름이다.

단계별 동작

  1. 첫 번째 파일을 개방한다.
  2. 두 번째 파일을 생성한다.
  3. 첫 번째 파일을 읽어 두 번째 파일에 쓴다.
  4. 첫 번째 파일의 끝에 도달할 때까지 3번 동작을 반복한다.
  5. 두 파일을 닫는다.
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BUFSIZE 512 /* 한 번에 읽을 문자열의 크기 */
#define PERM 0644   /* 새로 만든 파일의 사용 권한 */

/**
 * 파일을 복사하여 사본을 생성한다.
 * @param src 원본 파일 이름
 * @param dst 사본 파일 이름
 * @return 정상적으로 처리된 경우 0, 오류가 있는 경우 1
 */
int copy_file(const char *src, const char *dst);
void create_holed_file(const char *str);
int fatal(const char *str);

int main() {
  create_holed_file("file.hole");
	copy_file("file.hole", "file2.hole");
	return 0;
}

int copy_file(const char *src, const char *dst) {
  int fd1, fd2, n;
  char buf[BUFSIZE];
  if ((fd1 = open(src, O_RDONLY)) < 0) {
    perror("file open error");
    exit(1);
  }
  if ((fd2 = creat(dst, PERM)) < 0) {
    perror("file creation error");
    exit(1);
  }
  while ((n = read(fd1, buf, BUFSIZE)) > 0) {
    write(fd2, buf, n);
  }
  close(fd1);
  close(fd2);
  
  return 0;
}

void create_holed_file(const char *str) {
  char buf1[] = "abcdefghij", buf2[] = "ABCDEFGHIJ";
  int fd;

  if ((fd = creat(str, 0640)) < 0)
    fatal("creat error");

  if (write(fd, buf1, 10) != 10)
    fatal("buf1 write error");

  if (lseek(fd, 40, SEEK_SET) == -1)
    fatal("lseek error");

  if (write(fd, buf2, 10) != 10)
    fatal("buf2 write error");
}

int fatal(const char *str) {
  perror(str);
  return 1;
}