오늘은 리눅스 명령어 cp에 대해서 알아보자.
💻 cp
cp는 copy의 약자로 파일을 복사한다.
$ cp source-file target-file
source-file을 target-file로 복사하는 명령어이다.
먄약 target-file이 존재하지 않는다면, 새로운 파일을 하나 만든다.
이 명령어가 어떻게 구현되어 있는지 알아볼텐데, 알아보기싫은데, 알아봐보자.
💻 시스템 콜 - creat
int fd = creat(char *filename, mode_t mode);
filename은 말 그대로 파일의 이름이다.
입력인자로 파일의 이름과, 모드를 건네주면 creat 시스템콜은 mode에 따라 권한을 부여해 파일을 생성한다.
오류가 나면 -1을 리턴해주고, 성공하면 fd를 리턴해준다.
💻 파일 쓰기 - write
ssize_t result = write(int fd, void *buf, size_t amt);
메모리에서 파일로 데이터를 보내는 시스템 콜이다.
입력인자로 fd, 버퍼, 버퍼사이즈를 입력받는다.
에러가 일어나면 -1을 리턴해주고, 성공시에는 바이트 수를 리턴해준다.
💻 cp 구현
cp를 구현할때 순서에 대해서 구상해보자.
1.먼저 복사할 파일을 open을 이용하여 읽기모드로 연다.
2. 복사한것을 저장할 파일을 creat를 이용하여 쓰기모드로 연다.
3.복사할 파일에서 buffer로 EOF를 만날 때까지 read를 이용해서 읽어준다.
4.복사한것을 저장해줄 파일에 write를 이용하여 read로 읽어준것을 저장한다.
이 순서에 따라서, 코드를 짜보자.
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#define BUFSIZE 4096
#define COPYMODE 0644
void oops(char *, char *);
int main(int ac, char *av[]){
int in_fd, out_fd, n_chars;
char buf[BUFSIZE];
if(ac != 3){
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 open ", av[2]);
while((n_chars = read(in_fd, buf, BUFSIZE))>0)
if(write(out_fd, buf, n_chars)!=n_chars)
oops("Write error to ", av[2]);
if(n_chars == -1)
oops("Read error from ", av[1]);
if(close(in_fd)==-1 || close(out_fd) == -1)
oops("Error closing files", "");
return 0;
}
void oops(char *s1, char *s2) {
fprintf(stderr, "Error: %s ",s1);
perror(s2);
exit(1);
}
💻 COPYMODE
처음에 COPYMODE라는 매크로를 644로 선언하여서 creat을 이용할때 입력인자로 넣어주었다.
이것이 무슨말일까?
ls-l에 대해서 설명할때 mode에 대해서 내가 설명하였다.
세자리씩 끊어서, 소유자,사용자,나머지 사람들에 대한 파일의 권한을 나타낸 것을 의미한다.
순서대로 r,w,x 였는데
여기서 6을 2진수로 바꿔서 3비트로 표현해보자. 110이다. 이말은 rw-를 의미하며 읽고 쓰는것에 대한 권한이 주어졌다는 것을 의미한다.
4는 100으로, r-- 이다. 읽기 권한만 주어졌다는 것이다. 이처럼 리눅스에서는 숫자를 통해 해당 파일의 권한을 부여할 수 있다.
'2-2 > 시스템 프로그래밍' 카테고리의 다른 글
[시스템 프로그래밍] Linux System - ls-l 구현 (1) | 2022.10.13 |
---|---|
[시스템 프로그래밍] Linux System - ls 구현하기 (0) | 2022.10.13 |
[시스템 프로그래밍] Linux System - 기본 명령어 (0) | 2022.09.16 |