slide1
Download
Skip this Video
Download Presentation
Linux/UNIX Programming APUE (File I/O ) 최미정 [email protected] 강원대학교 IT 대학 컴퓨터과학전공

Loading in 2 Seconds...

play fullscreen
1 / 36

Linux/UNIX Programming APUE (File I/O ) 최미정 [email protected] 강원대학교 IT 대학 컴퓨터과학전공 - PowerPoint PPT Presentation


  • 186 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Linux/UNIX Programming APUE (File I/O ) 최미정 [email protected] 강원대학교 IT 대학 컴퓨터과학전공' - matthew-robles


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1
Linux/UNIX Programming

APUE (File I/O)

최미정

[email protected]

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

slide2
강의 목표 및 내용

APUE (File I/O)

  • 강의 목표
    • 파일의 특성을 이해한다.
    • 파일을 열고 닫는다.
    • 파일로부터 데이터를 읽고 쓴다.
    • 기타 파일 제어 함수를 익힌다.
  • 강의 내용
    • 파일 구조 (UNIX 파일은 어떤 구조일까?)
    • 파일 관련 시스템 호출
    • 시스템 호출의 효율과 구조
slide3
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.(파일의 각 바이트는 고유의 주소를 가지고(매길 수) 있다.)

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

slide5
File Descriptor (2/2)

APUE (File I/O)

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

slide6
파일 관련 System Calls

APUE (File I/O)

open() – 열기

creat() - 파일 생성

close() – 닫기

read() – 읽기

write() – 쓰기

lseek() - 이동

slide7
open() – 파일 열기

APUE (File I/O)

#include

#include

#include

int open (const char *pathname, int oflag, [ mode_t mode ]);

  • 파일을 연다.
  • 파일이 없으면 경우에 따라 새로 만들어 질 수도 있다.
    • pathname : 파일의 이름
    • mode : 파일의 access permission 값으로, 생략가능 새로운 파일을 만드는 경우에만 사용됨 (creat() 함수 설명 참조)
    • 리턴 값 : 파일 식별자(file descriptor), 실패하면 -1
slide8
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 사용 가능
slide9
open()의 파라미터 (2/2)

APUE (File I/O)

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

APUE (File I/O)

slide11
creat() – 파일 생성

APUE (File I/O)

#include

#include

#include

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

  • 새로운 파일을 생성한다.
    • pathname : 파일의 이름
    • mode : 파일의 access permission 값
    • 리턴 값 : 파일 식별자(file descriptor), 실패하면 -1
slide12
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--
slide13
close() – 파일 닫기

APUE (File I/O)

#include

#include

#include

int close ( int filedesc );

  • 작업이 끝난 후 파일을 닫는다.
  • 파일을 닫지 않더라도 프로세스가 종료하면, 모든 열려진 파일들은 자동적으로 닫힌다.
    • filedesc : 닫고자 하는 파일의 파일 식별자 (File Descriptor)
    • 리턴 값 : 파일 식별자(file descriptor), 실패하면 -1
slide14
read() – 파일 읽기 (1/2)

APUE (File I/O)

#include

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

  • 파일에서 데이터를 읽는다.
  • buf: 읽은 데이터를 저장할 메모리 (버퍼)
  • nbytes: 읽을 데이터의 바이트 수
  • 리턴 값
    • 성공하면 읽은 바이트 수 (nbytes와 다를 수(작을 수) 있음)
    • 파일의 끝을 만나면 0
    • 실패하면 -1
slide15
read() – 파일 읽기 (2/2)

APUE (File I/O)

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

APUE (File I/O)

#include

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

  • 파일에 데이터를 쓴다.
  • buf: 쓸 데이터를 저장한 메모리 (버퍼)
  • nbytes: 쓸 데이터의 바이트 수
  • 리턴 값
    • 성공하면, 파일에 쓰여진 데이터의 바이트 수 (nbytes보다 작을 수 있음)
    • 실패하면 -1
slide19
lseek() – 오프셋(커서) 이동 (1/2)

APUE (File I/O)

#include

#include

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
slide20
lseek() – 오프셋(커서) 이동 (2/2)

APUE (File I/O)

  • 파일의 현재 위치(오프셋)를 임의의 위치로 이동한다
  • 파일의 현재 위치(current file offset)
    • 파일에 대한 읽기/쓰기는 파일의 현재 위치에서 실행된다.
    • 파일을 처음 열면 현재 위치는 0, 즉 파일의 시작이다.
    • 읽기/쓰기 후 파일의 현재 위치는 읽기/쓰기 한 byte 수 만큼 저절로 뒤로 이동된다.
    • lseek()를 사용하여 임의의 위치로 파일의 현재 위치를 이동할 수 있다
slide21
예제: lseek1.c (1/3)

APUE (File I/O)

slide22
예제: lseek1.c (2/3)

APUE (File I/O)

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

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

slide23
예제: lseek1.c (3/3)

APUE (File I/O)

slide24
fcntl() – 파일 제어

APUE (File I/O)

#include

#include

#include

int fcntl (int filedes, int cmd, … /* int arg */ );

  • 역할: 파일의 속성을 알아내거나 변경한다.
  • cmd: F_GETFL, F_SETFL, F_GETFD, F_SETFD, F_DUPFD, …
  • 리턴 값
    • 성공인 경우: 파라미터인 cmd에 따라 다름
    • 실패인 경우: -1
slide25
fcntl()의 주요 사용법

APUE (File I/O)

F_GETFL : file table 의 file status flags를 리턴

F_SETFL : file status flags 를 설정

slide28
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 플래그를 설정한다.
slide29
예제: write2.c (1/3)

APUE (File I/O)

slide30
예제: write2.c (2/3)

APUE (File I/O)

slide31
예제: write2.c (3/3)

APUE (File I/O)

slide32
실험 결과

APUE (File I/O)

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

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

slide33
에러 처리

APUE (File I/O)

  • 파라미터 errno 값에 해당하는 에러 메시지를 리턴한다.
  • 표준 에러에 다음과 같은 순서로 메시지를 출력한다.
    • msg 출력
    • 문자열 ": " 출력
    • 시스템 전역 변수(system global variable) errno 값에 해당하는 에러 메시지 출력

#include

void perror(const char *msg);

ad