1 / 36

Linux/UNIX Programming APUE (File I/O ) 최미정 mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

Linux/UNIX Programming APUE (File I/O ) 최미정 mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공. 강의 목표 및 내용. APUE (File I/O). 강의 목표 파일의 특성을 이해한다 . 파일을 열고 닫는다 . 파일로부터 데이터를 읽고 쓴다 . 기타 파일 제어 함수를 익힌다 . 강의 내용 파일 구조 (UNIX 파일은 어떤 구조일까 ?) 파일 관련 시스템 호출 시스템 호출의 효율과 구조. What is a File?.

Download Presentation

Linux/UNIX Programming APUE (File I/O ) 최미정 mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Linux/UNIX Programming APUE (File I/O) 최미정 mjchoi@kangwon.ac.kr 강원대학교 IT대학 컴퓨터과학전공

  2. 강의 목표 및 내용 APUE (File I/O) • 강의 목표 • 파일의 특성을 이해한다. • 파일을 열고 닫는다. • 파일로부터 데이터를 읽고 쓴다. • 기타 파일 제어 함수를 익힌다. • 강의 내용 • 파일 구조 (UNIX 파일은 어떤 구조일까?) • 파일 관련 시스템 호출 • 시스템 호출의 효율과 구조

  3. What is a File? APUE (File I/O) A file is a contiguous sequence of bytes.(UNIX에서 파일은 연속적인 바이트 시퀀스로 볼 수 있다.) No format imposed by the operating system.(UNIX 운영체제는 파일에 특별한 Format을 부여치 않는다.) Each byte is individually addressable in a disk file.(파일의 각 바이트는 고유의 주소를 가지고(매길 수) 있다.)

  4. File Descriptor (1/2) APUE (File I/O) open() returns an fd, an integer value. Used in subsequent I/O operations on that file.(Open된 파일의 fd는 이후 File I/O 연산에 사용된다.) close(fd) closes that file described by fd. All of a process's open files are automatically closed when it terminates.(프로세스가 종료되면, 해당 프로세스가 Open한 파일은 자동적으로 Close된다.)

  5. File Descriptor (2/2) APUE (File I/O) file descriptor: 0 ~ N (N = 19? or more) // unistd.h

  6. 파일 관련 System Calls APUE (File I/O) open() – 열기 creat() - 파일 생성 close() – 닫기 read() – 읽기 write() – 쓰기 lseek() - 이동

  7. open() – 파일 열기 APUE (File I/O) #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open (const char *pathname, int oflag, [ mode_t mode ]); • 파일을 연다. • 파일이 없으면 경우에 따라 새로 만들어 질 수도 있다. • pathname : 파일의 이름 • mode : 파일의 access permission 값으로, 생략가능 새로운 파일을 만드는 경우에만 사용됨 (creat() 함수 설명 참조) • 리턴 값 : 파일 식별자(file descriptor), 실패하면 -1

  8. open()의 파라미터 (1/2) APUE (File I/O) • 두 번째 파라미터 oflag는 다음 상수들의 (logical) OR이다. • 예 int fd;fd = open("afile", O_RDWR | O_CREAT, 0644); • 열기 모드에 대해서, 반드시 하나를 지정해 주어야 한다. • O_RDONLY : 읽기 모드, write 함수를 사용 할 수 없음 • O_WRONLY : 쓰기 모드, read 함수를 사용 할 수 없음 • O_RDWR : 읽고 쓰기 모드, read 및 write 사용 가능

  9. open()의 파라미터 (2/2) APUE (File I/O) • 선택적 지정 가능 플래그 • O_APPEND : 모든 write 된 데이터는 파일의 끝에 추가된다. • O_CREAT : 파일이 없을 경우 파일을 생성한다(이 경우, 세 번째 인자 mode가 사용). • O_EXCL : 그 이름의 파일이 이미 있고 O_CREAT를 지정한 경우 에러를 발생시킨다. • O_TRUNC : 파일이 있는 경우에 기존 내용을 지우고, 파일 크기를 0으로 만든다. • O_SYNC : 각 write 함수 호출은 디스크에 물리적으로 쓰여진 후 리턴한다

  10. 예제: open.c APUE (File I/O)

  11. creat() – 파일 생성 APUE (File I/O) #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int creat ( const char *pathname, mode_t mode ); • 새로운 파일을 생성한다. • pathname : 파일의 이름 • mode : 파일의 access permission 값 • 리턴 값 : 파일 식별자(file descriptor), 실패하면 -1

  12. creat()의 파라미터 APUE (File I/O) • 다음 두 함수의 호출은 동일한 기능을 수행함 • fd = creat ( pathname, mode ); • fd = open ( pathname, O_WRONLY | O_CREAT | O_TRUNC, mode); • 두 번째 파라미터인 mode는 permission mode를 나타냄 • 0644  -rw-r--r-- • 0755  -rwxr-xr-x • 0444  -r--r--r--

  13. close() – 파일 닫기 APUE (File I/O) #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int close ( int filedesc ); • 작업이 끝난 후 파일을 닫는다. • 파일을 닫지 않더라도 프로세스가 종료하면, 모든 열려진 파일들은 자동적으로 닫힌다. • filedesc : 닫고자 하는 파일의 파일 식별자 (File Descriptor) • 리턴 값 : 파일 식별자(file descriptor), 실패하면 -1

  14. read() – 파일 읽기 (1/2) APUE (File I/O) #include <unistd.h> ssize_t read ( int filedes, void *buf, size_t nbytes ); • 파일에서 데이터를 읽는다. • buf: 읽은 데이터를 저장할 메모리 (버퍼) • nbytes: 읽을 데이터의 바이트 수 • 리턴 값 • 성공하면 읽은 바이트 수 (nbytes와 다를 수(작을 수) 있음) • 파일의 끝을 만나면 0 • 실패하면 -1

  15. read() – 파일 읽기 (2/2) APUE (File I/O) • 읽을 데이터가 충분하면 한 번에 nbytes만큼 읽는다. • 읽을 데이터가 nbytes보다 적은 경우 더 적게 읽기도 한다. • 파일의 끝에 다다른 경우 • 네트워크 입출력을 수행하는 경우 • 참고 • size_t : unsigned integer • ssize_t : signed integer

  16. 예제: count.c (문자 수 세는 프로그램) (1/2) APUE (File I/O)

  17. 예제: count.c (문자 수 세는 프로그램) (2/2) APUE (File I/O)

  18. write() – 파일 쓰기 APUE (File I/O) #include <unistd.h> ssize_t write (int filedes, const void *buf, size_t nbytes); • 파일에 데이터를 쓴다. • buf: 쓸 데이터를 저장한 메모리 (버퍼) • nbytes: 쓸 데이터의 바이트 수 • 리턴 값 • 성공하면, 파일에 쓰여진 데이터의 바이트 수 (nbytes보다 작을 수 있음) • 실패하면 -1

  19. lseek() – 오프셋(커서) 이동 (1/2) APUE (File I/O) #include <sys/types.h> #include <unistd.h> off_t lseek (int filedes, off_t offset, int whence ); • 파일의 현재 위치(current file offset)를 이동한다. • 파라미터 설명 • whence: (이동을 시작할) 위치의 기준점 • SEEK_SET : 파일의 시작점을 기준으로 이동 • SEEK_CUR : 현재 위치를 기준으로 이동 • SEEK_END : 파일의 끝을 기준으로 이동 • offset: 기준점에서의 상대적인 거리 (byte 단위) • SEEK_CUR, SEEK_END 와 같이 쓰일 때는 음수도 가능 • 리턴 값: 성공하면 이동한 현재 위치를 리턴, 실패하면 -1

  20. lseek() – 오프셋(커서) 이동 (2/2) APUE (File I/O) • 파일의 현재 위치(오프셋)를 임의의 위치로 이동한다 • 파일의 현재 위치(current file offset) • 파일에 대한 읽기/쓰기는 파일의 현재 위치에서 실행된다. • 파일을 처음 열면 현재 위치는 0, 즉 파일의 시작이다. • 읽기/쓰기 후 파일의 현재 위치는 읽기/쓰기 한 byte 수 만큼 저절로 뒤로 이동된다. • lseek()를 사용하여 임의의 위치로 파일의 현재 위치를 이동할 수 있다

  21. 예제: lseek1.c (1/3) APUE (File I/O)

  22. 예제: lseek1.c (2/3) APUE (File I/O) lseek1.c 의 출력 파일 “file.hole”의 내용 UNIX 명령어인 od (octal dump)를 사용하여 확인할 수 있음

  23. 예제: lseek1.c (3/3) APUE (File I/O)

  24. fcntl() – 파일 제어 APUE (File I/O) #include <sys/types.h> #include <fcntl.h> #include <unistd.h> int fcntl (int filedes, int cmd, … /* int arg */ ); • 역할: 파일의 속성을 알아내거나 변경한다. • cmd: F_GETFL, F_SETFL, F_GETFD, F_SETFD, F_DUPFD, … • 리턴 값 • 성공인 경우: 파라미터인 cmd에 따라 다름 • 실패인 경우: -1

  25. fcntl()의 주요 사용법 APUE (File I/O) F_GETFL : file table 의 file status flags를 리턴 F_SETFL : file status flags 를 설정

  26. 예제: fileflags.c (1/2) APUE (File I/O)

  27. 예제: fileflags.c (2/2) APUE (File I/O)

  28. Asynchronous Write APUE (File I/O) • UNIX에서의 Write는 Asynchronous Write 이다. • 데이터가 디스크에 쓰여지길 기다리지 않고, • 쓰여질 데이터를 큐(queue)에 등록하고 바로 리턴한다. • 큐에 등록된 데이터는 나중에 (Scheduling에 의해 한꺼번에) 디스크에 쓰여진다 • Synchronous Write • Write 호출은 데이터가 실제로 디스크에 쓰여진 후 리턴한다. • Asynchronous Write에 비해서 Clock Time이 증가한다. • File Table 의 File Status Flags 에서 O_SYNC 플래그를 설정한다.

  29. 예제: write2.c (1/3) APUE (File I/O)

  30. 예제: write2.c (2/3) APUE (File I/O)

  31. 예제: write2.c (3/3) APUE (File I/O)

  32. 실험 결과 APUE (File I/O) 상기 결과에서 볼 수 있듯이 Synchronous Write가 훨씬 더 느림 DBMS(Database Management System)처럼 실제로 데이터가 디스크에 기록되었는지 여부가 중요한 경우에 사용됨

  33. 에러 처리 APUE (File I/O) • 파라미터 errno 값에 해당하는 에러 메시지를 리턴한다. • 표준 에러에 다음과 같은 순서로 메시지를 출력한다. • msg 출력 • 문자열 ": " 출력 • 시스템 전역 변수(system global variable) errno 값에 해당하는 에러 메시지 출력 #include <stdio.h> void perror(const char *msg);

  34. write_num.c / read_num.c (1/3) APUE (File I/O)

  35. write_num.c / read_num.c (2/3) APUE (File I/O)

  36. write_num.c / read_num.c (3/3) APUE (File I/O)

More Related