360 likes | 604 Views
Linux/UNIX Programming APUE (File I/O ) 최미정 mjchoi@kangwon.ac.kr 강원대학교 IT 대학 컴퓨터과학전공. 강의 목표 및 내용. APUE (File I/O). 강의 목표 파일의 특성을 이해한다 . 파일을 열고 닫는다 . 파일로부터 데이터를 읽고 쓴다 . 기타 파일 제어 함수를 익힌다 . 강의 내용 파일 구조 (UNIX 파일은 어떤 구조일까 ?) 파일 관련 시스템 호출 시스템 호출의 효율과 구조. What is a File?.
E N D
Linux/UNIX Programming APUE (File I/O) 최미정 mjchoi@kangwon.ac.kr 강원대학교 IT대학 컴퓨터과학전공
강의 목표 및 내용 APUE (File I/O) • 강의 목표 • 파일의 특성을 이해한다. • 파일을 열고 닫는다. • 파일로부터 데이터를 읽고 쓴다. • 기타 파일 제어 함수를 익힌다. • 강의 내용 • 파일 구조 (UNIX 파일은 어떤 구조일까?) • 파일 관련 시스템 호출 • 시스템 호출의 효율과 구조
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.(파일의 각 바이트는 고유의 주소를 가지고(매길 수) 있다.)
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된다.)
File Descriptor (2/2) APUE (File I/O) file descriptor: 0 ~ N (N = 19? or more) // unistd.h
파일 관련 System Calls APUE (File I/O) open() – 열기 creat() - 파일 생성 close() – 닫기 read() – 읽기 write() – 쓰기 lseek() - 이동
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
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 사용 가능
open()의 파라미터 (2/2) APUE (File I/O) • 선택적 지정 가능 플래그 • O_APPEND : 모든 write 된 데이터는 파일의 끝에 추가된다. • O_CREAT : 파일이 없을 경우 파일을 생성한다(이 경우, 세 번째 인자 mode가 사용). • O_EXCL : 그 이름의 파일이 이미 있고 O_CREAT를 지정한 경우 에러를 발생시킨다. • O_TRUNC : 파일이 있는 경우에 기존 내용을 지우고, 파일 크기를 0으로 만든다. • O_SYNC : 각 write 함수 호출은 디스크에 물리적으로 쓰여진 후 리턴한다
예제: open.c APUE (File I/O)
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
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--
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
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
read() – 파일 읽기 (2/2) APUE (File I/O) • 읽을 데이터가 충분하면 한 번에 nbytes만큼 읽는다. • 읽을 데이터가 nbytes보다 적은 경우 더 적게 읽기도 한다. • 파일의 끝에 다다른 경우 • 네트워크 입출력을 수행하는 경우 • 참고 • size_t : unsigned integer • ssize_t : signed integer
예제: count.c (문자 수 세는 프로그램) (1/2) APUE (File I/O)
예제: count.c (문자 수 세는 프로그램) (2/2) APUE (File I/O)
write() – 파일 쓰기 APUE (File I/O) #include <unistd.h> ssize_t write (int filedes, const void *buf, size_t nbytes); • 파일에 데이터를 쓴다. • buf: 쓸 데이터를 저장한 메모리 (버퍼) • nbytes: 쓸 데이터의 바이트 수 • 리턴 값 • 성공하면, 파일에 쓰여진 데이터의 바이트 수 (nbytes보다 작을 수 있음) • 실패하면 -1
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
lseek() – 오프셋(커서) 이동 (2/2) APUE (File I/O) • 파일의 현재 위치(오프셋)를 임의의 위치로 이동한다 • 파일의 현재 위치(current file offset) • 파일에 대한 읽기/쓰기는 파일의 현재 위치에서 실행된다. • 파일을 처음 열면 현재 위치는 0, 즉 파일의 시작이다. • 읽기/쓰기 후 파일의 현재 위치는 읽기/쓰기 한 byte 수 만큼 저절로 뒤로 이동된다. • lseek()를 사용하여 임의의 위치로 파일의 현재 위치를 이동할 수 있다
예제: lseek1.c (1/3) APUE (File I/O)
예제: lseek1.c (2/3) APUE (File I/O) lseek1.c 의 출력 파일 “file.hole”의 내용 UNIX 명령어인 od (octal dump)를 사용하여 확인할 수 있음
예제: lseek1.c (3/3) APUE (File I/O)
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
fcntl()의 주요 사용법 APUE (File I/O) F_GETFL : file table 의 file status flags를 리턴 F_SETFL : file status flags 를 설정
예제: fileflags.c (1/2) APUE (File I/O)
예제: fileflags.c (2/2) APUE (File I/O)
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 플래그를 설정한다.
예제: write2.c (1/3) APUE (File I/O)
예제: write2.c (2/3) APUE (File I/O)
예제: write2.c (3/3) APUE (File I/O)
실험 결과 APUE (File I/O) 상기 결과에서 볼 수 있듯이 Synchronous Write가 훨씬 더 느림 DBMS(Database Management System)처럼 실제로 데이터가 디스크에 기록되었는지 여부가 중요한 경우에 사용됨
에러 처리 APUE (File I/O) • 파라미터 errno 값에 해당하는 에러 메시지를 리턴한다. • 표준 에러에 다음과 같은 순서로 메시지를 출력한다. • msg 출력 • 문자열 ": " 출력 • 시스템 전역 변수(system global variable) errno 값에 해당하는 에러 메시지 출력 #include <stdio.h> void perror(const char *msg);
write_num.c / read_num.c (1/3) APUE (File I/O)
write_num.c / read_num.c (2/3) APUE (File I/O)
write_num.c / read_num.c (3/3) APUE (File I/O)