linux/unix programming apue (file i/o ) 최미정 [email protected] 강원대학교 it 대학...

36
Linux/UNIX Programming APUE (File I/O) 최최최 [email protected] 최최최최최 IT 최최 최최최최최최최

Upload: matthew-robles

Post on 01-Jan-2016

74 views

Category:

Documents


0 download

DESCRIPTION

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

TRANSCRIPT

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

Linux/UNIX Programming

APUE (File I/O)

최미정[email protected]

강원대학교 IT 대학 컴퓨터과학전공

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

UNIX System Program-mingPage 2

강의 목표 및 내용

강의 목표

• 파일의 특성을 이해한다 .

• 파일을 열고 닫는다 .

• 파일로부터 데이터를 읽고 쓴다 .

• 기타 파일 제어 함수를 익힌다 .

강의 내용

• 파일 구조 (UNIX 파일은 어떤 구조일까 ?)

• 파일 관련 시스템 호출

• 시스템 호출의 효율과 구조

APUE (File I/O)

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

UNIX System Program-mingPage 3

What is a File?

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.( 파일의 각 바이트는 고유의 주소를 가지고 ( 매길 수 ) 있다 .)

APUE (File I/O)

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

UNIX System Program-mingPage 4

File Descriptor (1/2)

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 된다 .)

APUE (File I/O)

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

UNIX System Program-mingPage 5

File Descriptor (2/2)

file descriptor: 0 ~ N (N = 19? or more) // unistd.h

APUE (File I/O)

Value Meaning

0 standard input

1 standard output

2 standard error

3 .. 19 fds for users

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

UNIX System Program-mingPage 6

파일 관련 System Calls

open() – 열기

creat() - 파일 생성

close() – 닫기

read() – 읽기

write() – 쓰기

lseek() - 이동

APUE (File I/O)

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

UNIX System Program-mingPage 7

open() – 파일 열기

파일을 연다 .

파일이 없으면 경우에 따라 새로 만들어 질 수도 있다 .

• pathname : 파일의 이름

• mode : 파일의 access permission 값으로 , 생략가능 새로운 파일을 만드는 경우에만 사용됨 (creat() 함수 설명 참조 )

• 리턴 값 : 파일 식별자 (file descriptor), 실패하면 -1

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 ]);

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

UNIX System Program-mingPage 8

open() 의 파라미터 (1/2)

두 번째 파라미터 oflag 는 다음 상수들의 (logical) OR 이다 .

• 예

int fd;

fd = open("afile", O_RDWR | O_CREAT, 0644);

열기 모드에 대해서 , 반드시 하나를 지정해 주어야 한다 .

• O_RDONLY : 읽기 모드 , write 함수를 사용 할 수 없음

• O_WRONLY : 쓰기 모드 , read 함수를 사용 할 수 없음

• O_RDWR : 읽고 쓰기 모드 , read 및 write 사용 가능

APUE (File I/O)

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

UNIX System Program-mingPage 9

open() 의 파라미터 (2/2)

선택적 지정 가능 플래그

• O_APPEND : 모든 write 된 데이터는 파일의 끝에 추가된다 .

• O_CREAT : 파일이 없을 경우 파일을 생성한다 ( 이 경우 , 세 번째 인자 mode

가 사용 ).

• O_EXCL : 그 이름의 파일이 이미 있고 O_CREAT 를 지정한 경우 에러를 발생시킨다 .

• O_TRUNC : 파일이 있는 경우에 기존 내용을 지우고 , 파일 크기를 0 으로 만든다 .

• O_SYNC : 각 write 함수 호출은 디스크에 물리적으로 쓰여진 후 리턴한다

APUE (File I/O)

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

UNIX System Program-mingPage 10

예제 : open.cAPUE (File I/O)

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

UNIX System Program-mingPage 11

creat() – 파일 생성

새로운 파일을 생성한다 .

• pathname : 파일의 이름

• mode : 파일의 access permission 값

• 리턴 값 : 파일 식별자 (file descriptor), 실패하면 -1

APUE (File I/O)

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>

int creat ( const char *pathname, mode_t mode );

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

UNIX System Program-mingPage 12

creat() 의 파라미터

다음 두 함수의 호출은 동일한 기능을 수행함

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

APUE (File I/O)

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

UNIX System Program-mingPage 13

close() – 파일 닫기

작업이 끝난 후 파일을 닫는다 .

파일을 닫지 않더라도 프로세스가 종료하면 , 모든 열려진 파일들은 자동적으로 닫힌다 .

• filedesc : 닫고자 하는 파일의 파일 식별자 (File Descriptor)

• 리턴 값 : 파일 식별자 (file descriptor), 실패하면 -1

APUE (File I/O)

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>

int close ( int filedesc );

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

UNIX System Program-mingPage 14

read() – 파일 읽기 (1/2)

파일에서 데이터를 읽는다 .

buf: 읽은 데이터를 저장할 메모리 ( 버퍼 )

nbytes: 읽을 데이터의 바이트 수

리턴 값

• 성공하면 읽은 바이트 수 (nbytes 와 다를 수 ( 작을 수 ) 있음 )

• 파일의 끝을 만나면 0

• 실패하면 -1

APUE (File I/O)

#include <unistd.h>

ssize_t read ( int filedes, void *buf, size_t nbytes );

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

UNIX System Program-mingPage 15

read() – 파일 읽기 (2/2)

읽을 데이터가 충분하면 한 번에 nbytes 만큼 읽는다 .

읽을 데이터가 nbytes 보다 적은 경우 더 적게 읽기도 한다 .

• 파일의 끝에 다다른 경우

• 네트워크 입출력을 수행하는 경우

참고

• size_t : unsigned integer

• ssize_t : signed integer

APUE (File I/O)

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

UNIX System Program-mingPage 16

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

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

UNIX System Program-mingPage 17

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

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

UNIX System Program-mingPage 18

write() – 파일 쓰기

파일에 데이터를 쓴다 .

buf: 쓸 데이터를 저장한 메모리 ( 버퍼 )

nbytes: 쓸 데이터의 바이트 수

리턴 값

• 성공하면 , 파일에 쓰여진 데이터의 바이트 수 (nbytes 보다 작을 수 있음 )

• 실패하면 -1

APUE (File I/O)

#include <unistd.h>

ssize_t write (int filedes, const void *buf, size_t nbytes);

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

UNIX System Program-mingPage 19

lseek() – 오프셋 ( 커서 ) 이동 (1/2)

파일의 현재 위치 (current file offset) 를 이동한다 .

파라미터 설명• whence: ( 이동을 시작할 ) 위치의 기준점

− SEEK_SET : 파일의 시작점을 기준으로 이동

− SEEK_CUR : 현재 위치를 기준으로 이동

− SEEK_END : 파일의 끝을 기준으로 이동

• offset: 기준점에서의 상대적인 거리 (byte 단위 )

• SEEK_CUR, SEEK_END 와 같이 쓰일 때는 음수도 가능

리턴 값 : 성공하면 이동한 현재 위치를 리턴 , 실패하면 -1

APUE (File I/O)

#include <sys/types.h>#include <unistd.h>off_t lseek (int filedes, off_t offset, int whence );

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

UNIX System Program-mingPage 20

lseek() – 오프셋 ( 커서 ) 이동 (2/2)

파일의 현재 위치 ( 오프셋 ) 를 임의의 위치로 이동한다

파일의 현재 위치 (current file offset)

• 파일에 대한 읽기 / 쓰기는 파일의 현재 위치에서 실행된다 .

• 파일을 처음 열면 현재 위치는 0, 즉 파일의 시작이다 .

• 읽기 / 쓰기 후 파일의 현재 위치는 읽기 / 쓰기 한 byte 수 만큼 저절로 뒤로 이동된다 .

• lseek() 를 사용하여 임의의 위치로 파일의 현재 위치를 이동할 수 있다

APUE (File I/O)

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

UNIX System Program-mingPage 21

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

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

UNIX System Program-mingPage 22

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

lseek1.c 의 출력 파일 “ file.hole” 의 내용

UNIX 명령어인 od (octal dump) 를 사용하여 확인할 수 있음

0 1 2 3 4 5 6 7 8 9

0 a b c d e f g h i j

10 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

20 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

30 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

40 A B C D E F G H I J

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

UNIX System Program-mingPage 23

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

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

UNIX System Program-mingPage 24

fcntl() – 파일 제어APUE (File I/O)

역할 : 파일의 속성을 알아내거나 변경한다 .

cmd: F_GETFL, F_SETFL, F_GETFD, F_SETFD, F_DUPFD, …

리턴 값

• 성공인 경우 : 파라미터인 cmd 에 따라 다름

• 실패인 경우 : -1

#include <sys/types.h>#include <fcntl.h>#include <unistd.h>int fcntl (int filedes, int cmd, … /* int arg */ );

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

UNIX System Program-mingPage 25

fcntl() 의 주요 사용법APUE (File I/O)

F_GETFL : file table 의 file status flags 를 리턴

F_SETFL : file status flags 를 설정

File status flag Description

O_RDONLYO_WRONLYO_RDWR

open for reading onlyopen for writing onlyopen for reading and writing

O_APPENDO_NONBLOCKO_SYNCO_ASYNC

append on each writenonblocking modewait for writes to completeasynchoronous I/O

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

UNIX System Program-mingPage 26

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

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

UNIX System Program-mingPage 27

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

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

UNIX System Program-mingPage 28

Asynchronous Write

UNIX 에서의 Write 는 Asynchronous Write 이다 .

• 데이터가 디스크에 쓰여지길 기다리지 않고 ,

• 쓰여질 데이터를 큐 (queue) 에 등록하고 바로 리턴한다 .

• 큐에 등록된 데이터는 나중에 (Scheduling 에 의해 한꺼번에 ) 디스크에 쓰여진다

Synchronous Write

• Write 호출은 데이터가 실제로 디스크에 쓰여진 후 리턴한다 .

• Asynchronous Write 에 비해서 Clock Time 이 증가한다 .

• File Table 의 File Status Flags 에서 O_SYNC 플래그를 설정한다 .

APUE (File I/O)

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

UNIX System Program-mingPage 29

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

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

UNIX System Program-mingPage 30

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

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

UNIX System Program-mingPage 31

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

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

UNIX System Program-mingPage 32

실험 결과

상기 결과에서 볼 수 있듯이 Synchronous Write 가 훨씬 더 느림

DBMS(Database Management System) 처럼 실제로 데이터가 디스크에 기록되었는지 여부가 중요한 경우에 사용됨

APUE (File I/O)

BUFFSIZE User CPU (seconds)

System CPU(seconds)

Clock time(seconds) #loops

asynchrohous 8,192 0.0 1.1 3.6 12,800

synchrohous 8,192 0.0 3.4 180.3 12,800

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

UNIX System Program-mingPage 33

에러 처리APUE (File I/O)

파라미터 errno 값에 해당하는 에러 메시지를 리턴한다 .

표준 에러에 다음과 같은 순서로 메시지를 출력한다 .

• msg 출력

• 문자열 ": " 출력

• 시스템 전역 변수 (system global variable) errno 값에 해당하는 에러 메시지 출력

#include <stdio.h>

void perror(const char *msg);

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

UNIX System Program-mingPage 34

write_num.c / read_num.c (1/3)

APUE (File I/O)

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

UNIX System Program-mingPage 35

write_num.c / read_num.c (2/3)

APUE (File I/O)

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

UNIX System Program-mingPage 36

write_num.c / read_num.c (3/3)

APUE (File I/O)