Linux/UNIX Programming APUE (File I/O) 문양세 강원대학교 IT대학 컴퓨터과학전공
강의 목표 및 내용 강의 목표 강의 내용 파일의 특성을 이해한다. 파일을 열고 닫는다. 파일로부터 데이터를 읽고 쓴다. APUE (File I/O) 강의 목표 파일의 특성을 이해한다. 파일을 열고 닫는다. 파일로부터 데이터를 읽고 쓴다. 기타 파일 제어 함수를 익힌다. 강의 내용 파일 구조 (Linux/Unix 파일은 어떤 구조일까?) 파일 관련 시스템 호출 시스템 호출의 효율과 구조
What is a File? APUE (File I/O) A file is a contiguous sequence of bytes. (Linux/Unix에서 파일은 연속적인 바이트 시퀀스로 볼 수 있다.) No format imposed by the operating system. (Linux/Unix 운영체제는 파일에 특별한 Format을 부여치 않는다.) Each byte is individually addressable in a disk file. (파일의 각 바이트는 고유의 주소를 가지고(매길 수) 있다.)
File Descriptor (1/2) open() returns an fd, an integer value. 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 Value Meaning standard input 1 standard output 2 standard error 3 .. 19 fds for users
파일 관련 System Calls open() – 열기 creat() - 파일 생성 close() – 닫기 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) 두 번째 파라미터 oflag는 다음 상수들의 (logical) OR이다. 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() – 파일 생성 새로운 파일을 생성한다. #include <sys/types.h> 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) 파일에서 데이터를 읽는다. buf: 읽은 데이터를 저장할 메모리 (버퍼) 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) 읽을 데이터가 충분하면 한 번에 nbytes 만큼 읽는다. 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() – 파일 쓰기 파일에 데이터를 쓴다. buf: 쓸 데이터를 저장한 메모리 (버퍼) 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) lseek1.c 의 출력 파일 “file.hole”의 내용 APUE (File I/O) lseek1.c 의 출력 파일 “file.hole”의 내용 Linux/Unix 명령어인 od (octal dump)를 사용하여 확인할 수 있음 1 2 3 4 5 6 7 8 9 a b c d e f g h i j 10 \0 20 30 40 A B C D E F G H I J
예제: 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()의 주요 사용법 F_GETFL : file table 의 file status flags를 리턴 APUE (File I/O) F_GETFL : file table 의 file status flags를 리턴 F_SETFL : file status flags 를 설정 File status flag Description O_RDONLY O_WRONLY O_RDWR open for reading only open for writing only open for reading and writing O_APPEND O_NONBLOCK O_SYNC O_ASYNC append on each write nonblocking mode wait for writes to complete asynchoronouse I/O
예제: fileflags.c (1/2) APUE (File I/O)
예제: fileflags.c (2/2) APUE (File I/O)
에러 처리 파라미터 errno 값에 해당하는 에러 메시지를 리턴한다. 표준 에러에 다음과 같은 순서로 메시지를 출력한다. APUE (File I/O) 파라미터 errno 값에 해당하는 에러 메시지를 리턴한다. 표준 에러에 다음과 같은 순서로 메시지를 출력한다. msg 출력 문자열 ": " 출력 시스템 전역 변수(system global variable) errno 값에 해당하는 에러 메시지 출력 #include <stdio.h> void perror(const char *msg);
에러 처리: perror.c (1/2) APUE (File I/O)
에러 처리: perror.c (2/2) APUE (File I/O)
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)
Homework#7