Presentation is loading. Please wait.

Presentation is loading. Please wait.

Linux/UNIX Programming

Similar presentations


Presentation on theme: "Linux/UNIX Programming"— Presentation transcript:

1 Linux/UNIX Programming
APUE (File I/O) 문양세 강원대학교 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) 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된다.)

5 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 fds for users

6 The meaning of each field will be explained in next slides.
파일을 위한 Kernel 자료 구조 – skip APUE (File I/O) v-node table open file table v-node information fd status flags process table entry current file offset v-node ptr i-node information file descriptors fd 0: fd flags ptr current file size fd 1: fd 2: fd 3: v-node information fd status flags current file offset i-node information v-node ptr current file size The meaning of each field will be explained in next slides.

7 Process Table Entry – skip
APUE (File I/O) 프로세스 테이블 (Process Table) 커널(kernel) 자료구조 프로세스 목록 프로세스  프로세스 테이블 항목 프로세스 테이블 항목 (Process Table Entry) 파일 구분자(file descriptor)의 배열을 포함

8 Open File Table – skip 파일 테이블 (File Table)
APUE (File I/O) 파일 테이블 (File Table) 커널 자료구조 열려진 모든 파일 목록 열려진 파일  파일 테이블의 항목 파일 테이블 항목 (File Table Entry) 파일 상태 플래그 (read, write, append, sync, nonblocking,…)  open()시 주는 정보 파일의 현재 위치 (current file offset) v-node에 대한 포인터

9 v-node – skip v-node의 내부 파일의 유형 (일반, 디렉토리, 특수 파일, …)
APUE (File I/O) v-node의 내부 파일의 유형 (일반, 디렉토리, 특수 파일, …) 함수들에 대한 포인터 배열: 이 파일을 다루는데 사용되는 함수들 i-node 하드 디스크에 저장되어 있는 자료구조 파일에 대한 (실질적인) 정보를 가지고 있음 소유자, 크기 파일이 위치한 장치 (실제 가장 중요한 정보에 해당함) 파일 내용 디스크 블럭에 대한 포인터 (실제 가장 중요한 정보에 해당함)

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

11 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

12 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 사용 가능

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

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

15 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

16 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--

17 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

18 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

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

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

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

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

23 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

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

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

26 예제: lseek1.c (2/3) lseek1.c 의 출력 파일 “file.hole”의 내용
APUE (File I/O) lseek1.c 의 출력 파일 “file.hole”의 내용 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

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

28 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

29 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

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

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

32 Asynchronous Write UNIX에서의 Write는 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 플래그를 설정한다.

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

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

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

36 실험 결과 상기 결과에서 볼 수 있듯이 Synchronous Write가 훨씬 더 느림
APUE (File I/O) BUFFSIZE User CPU (seconds) System CPU Clock time #loops asynchrohous 8,192 0.0 1.1 3.6 12,800 synchrohous 3.4 180.3 상기 결과에서 볼 수 있듯이 Synchronous Write가 훨씬 더 느림 DBMS(Database Management System)처럼 실제로 데이터가 디스크에 기록되었는지 여부가 중요한 경우에 사용됨

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

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

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

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


Download ppt "Linux/UNIX Programming"

Similar presentations


Ads by Google