Linux/UNIX Programming
This presentation is the property of its rightful owner.
Sponsored Links
1 / 36

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


  • 115 Views
  • Uploaded on
  • Presentation posted in: General

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

Download Presentation

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

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

Linux/UNIX Programming

APUE (File I/O)

최미정

[email protected]

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

강의 목표 및 내용

APUE (File I/O)

  • 강의 목표

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

    • 파일을 열고 닫는다.

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

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

  • 강의 내용

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

    • 파일 관련 시스템 호출

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

File Descriptor (2/2)

APUE (File I/O)

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

파일 관련 System Calls

APUE (File I/O)

open()– 열기

creat()- 파일 생성

close()– 닫기

read()– 읽기

write()– 쓰기

lseek()- 이동


Linux unix programming apue file i o mjchoi kangwon ac kr it

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

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

APUE (File I/O)

  • 선택적 지정 가능 플래그

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

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

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

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

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

예제: open.c

APUE (File I/O)


Linux unix programming apue file i o mjchoi kangwon ac kr it

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

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

APUE (File I/O)

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

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

    • 파일의 끝에 다다른 경우

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

  • 참고

    • size_t : unsigned integer

    • ssize_t : signed integer


Linux unix programming apue file i o mjchoi kangwon ac kr it

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

APUE (File I/O)


Linux unix programming apue file i o mjchoi kangwon ac kr it

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

APUE (File I/O)


Linux unix programming apue file i o mjchoi kangwon ac kr it

write() – 파일 쓰기

APUE (File I/O)

#include <unistd.h>

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

  • 파일에 데이터를 쓴다.

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

  • nbytes: 쓸 데이터의 바이트 수

  • 리턴 값

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

    • 실패하면 -1


Linux unix programming apue file i o mjchoi kangwon ac kr it

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

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

APUE (File I/O)

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

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

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

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

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

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

예제: lseek1.c (1/3)

APUE (File I/O)


Linux unix programming apue file i o mjchoi kangwon ac kr it

예제: lseek1.c (2/3)

APUE (File I/O)

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

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

예제: lseek1.c (3/3)

APUE (File I/O)


Linux unix programming apue file i o mjchoi kangwon ac kr it

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

fcntl()의 주요 사용법

APUE (File I/O)

F_GETFL: file table 의 file status flags를 리턴

F_SETFL: file status flags 를 설정


Linux unix programming apue file i o mjchoi kangwon ac kr it

예제: fileflags.c (1/2)

APUE (File I/O)


Linux unix programming apue file i o mjchoi kangwon ac kr it

예제: fileflags.c (2/2)

APUE (File I/O)


Linux unix programming apue file i o mjchoi kangwon ac kr it

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 플래그를 설정한다.


Linux unix programming apue file i o mjchoi kangwon ac kr it

예제: write2.c (1/3)

APUE (File I/O)


Linux unix programming apue file i o mjchoi kangwon ac kr it

예제: write2.c (2/3)

APUE (File I/O)


Linux unix programming apue file i o mjchoi kangwon ac kr it

예제: write2.c (3/3)

APUE (File I/O)


Linux unix programming apue file i o mjchoi kangwon ac kr it

실험 결과

APUE (File I/O)

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

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


Linux unix programming apue file i o mjchoi kangwon ac kr it

에러 처리

APUE (File I/O)

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

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

    • msg 출력

    • 문자열 ": " 출력

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

#include <stdio.h>

void perror(const char *msg);


Linux unix programming apue file i o mjchoi kangwon ac kr it

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

APUE (File I/O)


Linux unix programming apue file i o mjchoi kangwon ac kr it

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

APUE (File I/O)


Linux unix programming apue file i o mjchoi kangwon ac kr it

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

APUE (File I/O)


  • Login