4-1/실시간시스템

week3 - 저수준 파일 입출력

ITTO 2022. 3. 22. 20:47

오늘은 본격적으로 책의 파일입출력을 배웠다.

저수준과 고수준을 배웠는데, 저수준은 커널모드의 system call을 이용해서 하드웨어를 직접 제어하고, 그렇기때문에 훨씬 빠르다.

고수준은 우리가 아는 라이브러리를 사용하는 방법이다. 파일 포인터를 선언해서 포인터가 가르키는 파일을 읽어온다. 저수준은 파일 포인터가 아닌 파일 기록자(file descripter)이라고 부르는 것을 사용한다.

이중에서도 오늘은 저수준 파일 입출력을 배웠다.

+C언어에 대한 복습도 했는데, main에서 argc와 argv를 받아오는 거나 포인터에 대해 복기하였다.

 

1. open, close, read, write 시스템콜을 사용하여 파일을 복사하는 프로그램을 완성하시오.

(단, commnad-line에서 파일이름을 읽어오도록 만드시오.)

 

argv와 argc에 담기는 내용은 커맨드 라인에서 읽어올 수 있다.

명령어, 옵션, 파라미터 등의 개수가 argc, 순서대로 argv의 배열에 담긴다.

 

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 #include <fcntl.h>
  5
  6 #define MAX_BUF 1024

//커맨드 라인에서 파라미터를 받아오기 위해 argc와 argv를 선언한다.
  7 int main(int argc, char* argv[]) {
  8     int rfd, wfd, n;
  9     char buf[MAX_BUF];
 10

//만약 argc가 3이 아니라면 사용법을 출력한다. [명령어 (파일이름) (파일이름)]의 으로만 받아올 수 있게 한다.
 11     if(argc != 3) {
 12         printf("Usage : %s source destination\n", argv[0]);
 13     }

//open의 시스템 콜을 이용해서 파라미터로 받아온 첫번째 파일 이름을 read only로 연다.
 14     rfd = open(argv[1], O_RDONLY);

//그것이 실패할 경우 오류를 출력한다. (실패라고 적어야했는데)
 15     if(rfd == -1) {
 16         printf("Open %s", argv[1]);
 17         exit(1);
 18     }
 19

//두번째 파일이름의 파일을 creat, write only, trunc 모드로 연다. creat는 없으면 생성하고, write only는 쓰기 전용으로, trunc는 파일이 만약 있으면 그 내용을 모두 삭제하고 새로 write한다는 의미이다.

//0644의 의미는 mode로서 파일 권한을 설정할 수 있다. 의미는 소유자는 읽기,쓰기가 가능하지만 다른사람은 읽기만 할 수 있다는 뜻이다.
 20     wfd = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0644);
 21     if(wfd == -1) {
 22         printf("Open %s", argv[2]);
 23         exit(1);
 24     }
 25

//파일을 8자씩 읽어 read해서 buf에 넣는다. read가 한번 완료되면 읽은 바이트 숫자 만큼(8만큼), 모두 완료되면 0, 오류가 뜨면 -1을 반환한다.
 26     while ((n = read(rfd, buf, 8)) > 0)

//buf에 있는 글자들 중 n글자(위에서 8씩 반환해서 n = 8) 만큼을 파일에 쓴다. 만약 그 숫자가 8이 아닐경우 오류를 출력한다.
 27         if(write(wfd, buf, n) != n) perror("write");
 28
 29     if (n == -1) perror("Read");
 30

//모든 작업이 끝난 후 close해준다.
 31     close(rfd);
 32     close(wfd);
 33
 34     return 0;
 35 }

이런 식으로 코딩을 완료한 후에 터미널에서 command를 수행했다.

터미널에서 명령어를 실행하는 모습

실습을 했던 내용이라 이미 파일이 생성되어있지만 문제없이 실행되는 모습이다.

lowlevelFileIO.c 에서 복사된 llfileIO.c의 모습