본문 바로가기

보안공부/Linux

File I/O

반응형

File I/O

open(): < fcntl.h >

- 파일이나 장치에 대한 접근 경로 설립

- 성공시 사용할 수 있는 새로운 File Descriptor 반환



구조

int open(cont char *path, int flags, mode_t mode)


path : 열고자 하는 파일의 절대 경로를 입력한다.

flags : 파일에 대한 제어방법

mode_t mode : 생성한 파일의 접근 권한


해당 파라미터의 인자값에 대해서는 /usr/include/asm-generic/fcntl.h 에 정의 되어 있다.

fcntl.h






file1.c





현재 file을 실행해보면 결과가 -1이 나오게 된다. test파일이 없기 때문에 그렇다.



test파일을 생성한 후의 결과는 다음과같다.



fcntl.h 헤더파일을 포함하여 작성한 코드는 아래와 같다.


커널에서 알려주는 errno라는 변수를 사용하게 되면 커널에서 자동적으로 에러의 종류를 알려주게된다. errno라는 변수를 사용하기 위해서는 errno.h파일을 포함해 준다.


예제로 test파일을 없이 실행해 보았고 다음과 같은 결과를 보여주었다.


errno.h 에서는 35번부터의 에러를 보여주고 그 이전의 에러는 errno-base.h 에 정의 되어있다.


2의 에러 종류를 보게되면 "No such file or directory" 라는 에러를 나타낸다. 즉 , test라는 파일이 존재하지 않는다는 의미이다.


사용자들이 보기에 errno만 출력하게 되면 불편할수 있다. 커널에서 제공해주는 strerror()함수를 이용하여서 출력하면 의미가 출력된다.


char *strerror(int errno)

- <string.h> 사용하며 errno 변수를 인자로 넘겨줘서 에러 형태를 문자열로 표현 해준다.



실행 결과는 다음과 같다.



위의 2가지의 에러 표시방법보다 좀더 편리한 방법이 있다. peerror() 함수를 사용하는 것이다.


void *perror(cont char &string)

- 오류 발생시 시스템이 오류메세지를 자동 출력




실행 결과는 다음과 같다.






파일쓰기

test라는 파일에 쓰기를 하는 플래그 옵션을 하나 더 주어서 없다면 생성을 하고 권한은 644권한으로 주겟다는 의미이다. 앞에 0이붙는이유는 8진수이다.

실행 결과는 다음과 같다.


test라는 파일이 없엇지만 file프로그램을 통하여서 test파일을 생성한 것 을 볼수 있다.


O_TRUNC -> 덮어쓰기

O_EXCL -> 기존 파일이 존재하면 덮어 씌우기를 하지 않겟다.

O_APPEND -> 이어쓰기


커널의 type.h 에는 다음과 같이 정의 되어 있다.

typedef unsigned int size_t

typedef int ssize_t



DATA 읽기 < unistd.h >

ssize_t read(int fd, void *buf, size_t n)

데이터읽기를 성공하면 읽은 바이트수를 return해주고 실패하면 -1을 return한다.

buf : 읽어들인 데이터를 저장하기 위한 장소.

n : 읽어올 데이터의 byte수가 0이면 종료



kmu라는 파일을 읽기 전용으로 열었고 5byte만큼의 글자를 읽어 온다.



결과는 아래와 같다.



DATA 쓰기

ssize_t write(int fd , const void *buf, size_t n)



univ파일을 쓰기 전용으로 열었고 만약 존재하지 않는다면 생성하고 존재하면다면 기존 내용에 추가하는 flag를 주었다.




실행 결과는 다음과 같다. univ 파일이 없었으므로 생성을하고 거기에 buf에 저장된 "University"문자열의 저장되었다.





반응형

'보안공부 > Linux' 카테고리의 다른 글

2016.05.02 수업  (0) 2016.05.02
lsmod  (0) 2016.04.18
정적,동적 라이브러리 생성  (0) 2016.04.04
Makefile  (0) 2016.04.04
gcc 컴파일  (0) 2016.04.04