4.I/O 프로그래밍

4-1. I/O 프로그래밍 개요

I/O 프로그래밍이란 파일입출력을 포함한 시리얼 패러럴 포트와 화면 디바이스등에 데이터를 입출력하는 것을 통틀어 의미합니다.

4-2 I/O 프로그래밍의 전체 구조

만들기

creat() -> write() -> close()

읽기

open()-> read() -> close()

쓰기

open()-> write() -> close()

커서 이동

open(),creat() -> lseek() -> read(),write() -> lseek()... ->close()

4-3 만들기

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

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

mode

S_IRWXU : 유저가 읽고 쓰고 실행할수 있는 파일

S_IRUSR : 유저가 읽을수 있는파일

S_IWUSR : 유저가 쓸수 있는 파일

S_IXUSR :유저가 실행할수 있는 파일

S_IRWXG : 그룹이 읽고 쓰고 실행할수 있는 파일

S_IRGRP : 그룹이 읽을수 있는 파일

S_IWGRP : 그룹이 쓸수 있는 파일

S_IXGRP : 그룹이 실행팔수 있는 파일

S_IRWXO: 누구나 일고 쓰고 실행할수 있는 파일

S_IROTH : 누구나 읽을수 있는 파일

S_IWOTH : 누구나 쓸수 있는 파일

S_IXGRP : 누구나 실행할수 있는 파일

ex)exwrite.c

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int main()

{

int fhandle,size;

char data[80];

fhandle=creat("test.dat",S_IRUSR|S_IWUSR);

if(fhandle < 0)

{

printf("test.dat file create failed!\n");

return 0;

}

memset(data,0,80);

strcpy(data,"this is test block");

size=write(fhandle,data,80);

if(size !=80)

{

printf("write error!\n");

return 0;

}

close(fhandle);

printf("create Ok!\n");

return 1;

}

출력결과

[sylee@cyberkorean ioprogram]$ ./write

Create OK!

4-4 읽기

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

flags

O_RDONLY : 읽기 전용 엑세스를 위해 파일을 연다

O_WRONLY : 쓰기 전용 엑세스를 위해 파일을 연다

O_RDWR : 읽기와 쓰기 엑세스를 위해 파일을 연다

O_CREAT : 파일이 존재하지 않으면 생성한다 (creat 함수의 mode 참조)

O_EXCL : 파일이 이미 존재하면 실패한다

O_NOCTTY : 열고자 하는 ttty와 프로세스가 제어하는 tty를 가지지 않았다면 즉 같은 제어권이 없으면 제어하는 tty가 되지 못한다

O_TRUNC : 파일이 존재하면 길이를 0으로 줄인다

O_APPEND : 현재 파일의 포인터를 파일의 마지막에 위치하게 한다

O_NONBLOCK : 프로세스가 지연없이 완료되지 않으면 완료되기 전에 반환한다

O_NODELAY : O_NONBLOCK 과 같다

O_SYNC : 기록이 완료 되는 경우 반환

O_DIRECTORY:  디렉토리가 아니면 open함수는 실패된다

O_LARGEFILE: 32-bit 시스템의 매우 큰파일 형태

ex)exread.c

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int main()

{

int fhandle,size;

char data[80];

fhandle=open("test.dat",O_RDWR);

if(fhandle < 0)

{

printf("test.dat file open failed!\n");

return 0;

}

size=read(fhandle,data,80);

if(size !=80)

{

printf("read error!\n");

return 0;

}

close(fhandle);

printf("%s\n",data);

return 1;

}

출력 결과

[sylee@cyberkorean ioprogram]$ ./a.out

this is test block

4-5 커서 이동

#include <sys/types.h>

#include <unistd.h>

off_t lseek(int fildes, off_t offset, int whence);

SEEK_SET : 파일 처음부터

SEEK_CUR : 현재 커서부터

SEEK_END : 파일끝

return value

성공시 : 현재 커서 위치

실패시

EBADF  : Fildes is not an open file descriptor.

ESPIPE : Fildes is associated with a pipe, socket, or  FIFO.

EINVAL : Whence is not a proper value.

ex)exseek.c

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

int main()

{

int fhandle,size;

char data[80];

fhandle=open("test.dat",O_RDWR);

if(fhandle < 0)

{

printf("test.dat file open failed!\n");

return 0;

}

lseek(fhandle,18,SEEK_SET);

strcpy(data,"another data");

write(fhandle,data,strlen(data));

lseek(fhandle,0,SEEK_SET);

size=read(fhandle,data,80);

if(size !=80)

{

printf("read error!\n");

return 0;

}

printf("%s\n",data);

close(fhandle);

return 1;

}

출력결과

[sylee@cyberkorean ioprogram]$ ./exseek

this is test blockanother data

4-5 파일 사본 만들기 (duplicate)

#include <unistd.h>

int dup(int oldfd);

int dup2(int oldfd, int newfd);

ex)exdup.c

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <assert.h>

void print_line(int n)

{

char buf[32];

snprintf(buf,sizeof(buf),"Line #%d\n",n);

write(1,buf,strlen(buf));

}

int main()

{

int fd;

print_line(1);

print_line(2);

print_line(3);

fd=open("junk.out",O_WRONLY| O_CREAT,0666);

assert(fd >=0);

dup2(fd,1);

print_line(4);

print_line(5);

print_line(6);

close(fd);

close(1);

return 1;

}

출력 결과

[sylee@cyberkorean ioprogram]$ ./a.out

Line #1

Line #2

Line #3

[sylee@cyberkorean ioprogram]$ cat junk.out

Line #4

Line #5

Line #6

4-6 파일 상태 정보 얻기

#include <sys/stat.h>

#include <unistd.h>

int stat(const char *file_name, struct stat *buf);

int fstat(int filedes, struct stat *buf);

int lstat(const char *file_name, struct stat *buf);

These  functions  return  information  about the specified

file.  You do not need any access rights to  the  file  to

get  this  information  but  you need search rights to all

directories named in the path leading to the file.

ex)

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

#include <fcntl.h>

int main()

{

int fhandle,size;

char data[80];

struct stat info;

fhandle=open("test.dat",O_RDWR);

fstat(fhandle,&info);

printf("st_uid %d\n",info.st_uid);

printf("st_mode %d\n",info.st_mode);

printf("st_nlink %d\n",info.st_nlink);

printf("st_gid %d\n",info.st_gid);

printf("st_rdev %d\n",info.st_rdev);

printf("st_size %d\n",info.st_size);

close(fhandle);

return 1;

}

출력결과

[sylee@cyberkorean ioprogram]$ ./a.out

st_uid 500

st_mode 33152

st_nlink 1

st_gid 500

st_rdev 0

st_size 80

4-7 기타 함수들

SYNOPSIS

#include <sys/types.h>

#include <unistd.h>

int chown(const char *path, uid_t owner, gid_t group);

int fchown(int fd, uid_t owner, gid_t group);

int lchown(const char *path, uid_t owner, gid_t group);

DESCRIPTION

The  owner  of  the  file  specified  by  path or by fd is

changed.  Only the super-user may change the  owner  of  a

file.   The  owner  of  a file may change the group of the

file to any group of which that owner is  a  member.   The

super-user may change the group arbitrarily.

SYNOPSIS

#include <sys/types.h>

#include <sys/stat.h>

int chmod(const char *path, mode_t mode);

int fchmod(int fildes, mode_t mode);

DESCRIPTION

The mode of the file given by path or referenced by fildes

is changed.

SYNOPSIS

#include <unistd.h>

int chdir(const char *path);

int fchdir(int fd);

DESCRIPTION

chdir  changes  the current directory to that specified in

path.

fchdir is identical to chdir, only that the  directory  is

given as an open file descriptor.

RETURN VALUE

On  success,  zero is returned.  On error, -1 is returned,

and errno is set appropriately.

SYNOPSIS

#include <sys/file.h>

int flock(int fd, int operation)

DESCRIPTION

Apply  or  remove  an  advisory lock on an open file.  The

file is specified  by  fd.   Valid  operations  are  given

below:

SYNOPSIS

#include <unistd.h>

int pipe(int filedes[2]);

DESCRIPTION

pipe  creates  a  pair  of file descriptors, pointing to a

pipe inode, and places them in the  array  pointed  to  by

filedes.   filedes[0]  is  for  reading, filedes[1] is for

writing.

RETURN VALUE

On success, zero is returned.  On error, -1  is  returned,

and errno is set appropriately.