copy_file() 함수 구현하기
- 파일을 복사하여 사본을 생성하는 copy_file()함수를 구현하라.
- low level function, 즉 open(), read(), write(), close()를 이용하여 구현하라.
- 단, hole이 있는 경우에도 복사할 수 있어야 한다.
Prototype
int copy_file(const char *src, const char *dst);
- src는 원본 파일의 이름이다.
- dst는 사본 파일의 이름이다.
단계별 동작
- 첫 번째 파일을 개방한다.
- 두 번째 파일을 생성한다.
- 첫 번째 파일을 읽어 두 번째 파일에 쓴다.
- 첫 번째 파일의 끝에 도달할 때까지 3번 동작을 반복한다.
- 두 파일을 닫는다.
#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;
}
'C > Linux' 카테고리의 다른 글
[C] 2개의 파이프를 사용한 양방향 통신 프로그램 구현하기 (0) | 2023.01.03 |
---|---|
[C] alarm 시그널을 받으면 1초 간격으로 메시지 출력하는 프로그램 구현하기 (0) | 2023.01.03 |
[C] ctrl + c 로 종료되지 않는 프로그램 구현하기 (0) | 2023.01.03 |
[C] execve()를 사용하여 execlp() 구현하기 (0) | 2023.01.03 |
[C] chmod a+rX [path] 구현하기 (0) | 2023.01.03 |