리눅스 시스템의 파일 복사를 위한 명령어 cp를 구현해보자.
cp를 구현하기 위해서는, 파일을 열고(open), 읽고(read), 만들고(creat) , 쓸(write) 수 있어야 한다 이를 위한 함수들을 알아보자.
함수 원형 :
#include <sys/types.h>
#include <fcntl.h>
int open(char* path,int flag)
//return : File Descriptor
path: 파일 경로
flag: file open mode
- about file open Mode
O_CREAT: file create
O_TRUNC: truncate size to 0
O_APPEND: append on each write
O_RDONLY: open for reading only
O_WRONLY: open for writing only
O_RDWR: open for reading and write
함수 원형
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t nbytes);
//return: read한 byte, 파일의 끝(EOF)이면 0을 리턴, 읽기 실패한 경우 -1을 리턴
fd: File Descriptor
buf: 읽은 정보를 저장할 buf
nbytes: 읽을 크기
함수 원형
#include <unistd.h>
int creat(const char *filepath, mote_t mode);
//return : 성공 시 0, 실패시 -1 리턴후 errno 설정
filepath: 생성할 파일의 경로
mode: 생성할 파일의 접근 권한을 명시
함수 원형
#include <unistd.h>
int write(int fd, void *buf,size_t n_chars);
//return: wirte 한 byte
fd: File Descriptor
buf: 쓸 buf
nbytes: 쓸 크기
함수 원형
#include <unistd.h>
int close(int fd);
//return: 0 if success, -1 if error
fd: File Descriptor
//2021115673 전창우
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#define BUFFERSIZE 4096 //한 번 read할 때 읽어올 byte 크기
#define COPYMODE 0644 // create할 경우 파일에 부여할 Permission
void oops(char* s1, char* s2) //에러 출력을 위한 함수
{
fprintf(stderr,"Error: %s",s1);
perror(s2);
exit(-1);
}
int main(int ac, char *av[])
{
int in_fd //read할 file descriptor
int out_fd //copt할 file descriptor
int n_chars; //read한 크기
char buf[BUFFERSIZE]; //데이터를 읽어올 버퍼
if(ac!=3) //cp [read file] [copy file name]
{
fprintf(stderr, "usage: %s source destination\n", *av);
exit(1);
}
if ((in_fd = open(av[1],O_RDONLY))==-1)
{
oops("Cannot open",av[1]);
}
if ((out_fd=creat(av[2],COPYMODE))==-1)
{
oops("Cannot creat ", av[2]);
}
int sum=0; //총 읽어온 크기
while ((n_chars = read(in_fd, buf, BUFFERSIZE)) > 0)
{
if (write(out_fd, buf, n_chars) != n_chars) {
oops("Write error to ", av[2]);
}
sum+=n_chars;
}
if (n_chars==-1)
{
oops("Read error from",av[1]);
}
if(close(in_fd)==-1 || close(out_fd)==-1)
{
oops("Error closing files","");
}
printf("total read bytes: %d\n",sum);
}