본문 바로가기
Linux

사물인터넷 기반 융합기술 교육 - 리눅스프로그래밍 2일

by Luhie 2017. 7. 18.

148p


저수준 파일 관련 함수


open() 파일을 읽거나 쓰기 위해서 열거나 생성


creat() 비어있는 파일을 생성


close() 이미 열려있는 파일 닫기


read() 열려있는 파일로 데이터 추출


write() 열려있는 파일로 데이터 저장


lseek() 파일에서 특정 위치로 파일 포인터 이동


unlink() 파일 삭제


remove() 파일이나 디렉토리 삭제


fcntl() 파일과 관련되어 있는 속성 조정




pathname 열거나 생성하고자 하는 파일의 이름 


oflag 플래그는 or로 구성가능


mode 새로운 파일을 만드는 경우 접근권한




파일의 플래그


반드시 하나만 정의


O_RDONLY 읽기전용


O_WRONLY 쓰기전용


O_RDWR 읽기, 쓰기 가능




파일 열기


http://forum.falinux.com/zbxe/index.php?document_srl=408448&mid=C_LIB


파일 읽기


http://forum.falinux.com/zbxe/index.php?_filter=search&mid=C_LIB&search_target=title&search_keyword=%ED%8C%8C%EC%9D%BC&document_srl=466628




BUFF_SIZE 한번에 읽어오는 사이즈 버퍼 사이즈 만큼만 읽어온다.


대부분의 c 언어의 함수들의 리턴형은 성공하면 0 실패하면 -1




\n도 문자이다




파일 쓰기


http://forum.falinux.com/zbxe/index.php?_filter=search&mid=C_LIB&search_target=title&search_keyword=%ED%8C%8C%EC%9D%BC&document_srl=408456






whence offset 을 옮기기위한 기준점


SEEK_SET, SEEK_CUR,SEEK_END


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


SEEK_CUR, SEEK_END와 같이 쓰일때는 음수도 허용






copy.c


터미널 표준 에러로 출력하란 소리


write(2, "Usage:copyfile1 file2",25);






스트림(stream)


프로그램과 파일사이의 자료 흐름


표준 입출력 함수는 스트림을 매개로 하여 파일에 접근


파일 포인터(FIle*)를 사용하여 참조




<stdio.h>에 정의된 상수


EOF: 파일의 끝


NULL : 널 포인터


BUFSIZ : 버퍼의 크기




C++ 클래스와 비슷




FILE 구조체


하나의 스트림을 다루기 위한 정보를 포함하는 구조체


-파일 디스크립터, 버퍼공간에 대한 포인터, 버퍼 크기, 버퍼에 남아있는 문자의 수, 에러 플래그 등


스트림을 개방하면 FILE 구조체에 대한 포인터를 반환


- 표준 입출력 함수는 fopen()에서 돌려 받은 값을 함수의 인자로 사용하여 다루고자 하는 파일을 지칭


각 프로세스는 3개의 파일 포인터 존재


- stdin(표준입력), stdout(표준 출력), stderr(표준 에러)






스트림 열기




해당파일의 스트림을 열고 버퍼를 할당


성공하면 FILE 포인터, 실패하면 NULL값을 반환


Type : 파일의 접근 모드(open() 함수와 비교)




스트림 닫기


FILE 포인터가 가리키는 스트림과 파일을 분리하고, 파일을 닫고 자원을 반환


성공하면0, 실패하면 EOF(-1)을 반환        EOF를 만날수 없다 계속 대기하니깐


출력 버퍼에 있는 모든 자료는 파일에 저장


입력 버퍼에 있는 모든 자료는 버려진 후에 버퍼를 해제




버퍼기반 입출력의 필요성


구조체 전체를 읽거나 쓰기를 원할 때


-getc() putc()등을 사용한다면


구조체 전체를 루프를 사용하여 순환하면서 한문자씩 처리






버퍼기반 입출력


size_t fread(void *ptr,size_t size, size_t nobj, FIle *fp);


size_t fwrite(const void *ptr,size_t size, size_t nobj,File *fp);


지정된 스트림에서 이진 구조체를 쓰거나 읽는다


입출력 객체의 개수


fread()한수의 경우 리턴값이 nobj값보다 작으면 에러나 파일의 끝을 만난경우 (ferror(),feof()등으로 구별


이진 배열에 대한 입출력이나 구조체에 대한 입출력으로 사용




fcopy() :  ansi-c


open() :  posix


open과 fopen과의 차이 


https://kldp.org/node/1350




getc()는 매크로 fgetc()함수로 구현


int ungetc(int c,FIle *fp);

지정된 문자를 스트림의 맨 앞으로 반환

성공하면 c 실패하면 EOF를 반환

특정 조검을 검사하기 위해 하나의 문자를 읽은 후 원래의 상태로 복원하기 위해 이용(단, 같은 문자일 필요는 없다)

- 입력 문자열을 단어나 토큰의 형태로 분리


문자 단위 출력


#define putchar(c) putc(c,stdout)

putc()는 매크로, fputc()는 함수로 구현

-putc()의 인자로 수식을 쓸 경우에는 주의

- fputc()는 함수이므로, 자신의 주소를 가질 수 있다.






파일 시스템의 종류

minix, ext, ext2, xiafs, umsdos, hpfs, isofs, msdos, nfs, sysv


파일의 상태 및 정보를 얻기


stat 파일의 상태값을 가지고 있는 구조체 


http://downman.tistory.com/126


argv[0]는 자기 자신


argv[]


argument variable


argc

count



$ ./copy a.txt b.txt

argc의 값은 count = 3

argv[0]의 첫번째 값 = copy

argv[1]의 두번째 값 = a.txt

argv[2]의 세번째 값 = b.txt



makefile 을 생성하고 

make TARGET=name 하면 인자값 변형 가능


심볼릭 링크(소프트 링크)

심볼릭 링크는 파일에 대한 간접적인 포인터

- 실제 파일에 대한 경로를 저장

링크의 한계점을 극복

- 링크는 단일 파일 시스템에서만 허용

- 디렉토리에 대한 링크는 수퍼 유저만 수행

파일을 다루는 함수를 사용할 때 심볼릭 링크를 추적하는지에 대해서 확인

- 심볼릭 링크 파일 자체를 다루는 함수

lchown, lstat,readlink, remove, rename, unlink

- 심볼릭 링크파일을 추적하는 함수

access, chdir, chmod,chown, creat, exec, link,mkdir, mkfifo, open, opendir, pathconf


정보 얻기

- ㅅㅁ볼릭 링크 파일을 읽는 함수 open, read, close 함수가 혼합된 

<unistd.h>

int readlink(const char *pathname, char *buf, int bufsize);


파일 접근 권한 결정


access(const char *pathname, int mode);


mode:R_OK,W_ok,X_Ok,F_ok

f 있냐 없냐 x는 실행


파일 속성

스티키 비트

S_isvtx 

- 실행파일의 이미지를 프로그램의 종료후에도 swap영역에 저장시킴으로써 재실행시 빠르게 메모리에 적재할수 있게 하기 위한 방법

- 요즘에는 사용 안함



디렉토리 구조

i-node list에 해당되는 디렉토리가 어딨는지 알려준다.

앞의 헤더를 날려버리면 데이터는 살아 있지만 찾기 힘들다 !!!

그래서 로우포멧을 해야한다!!! 아예 모든 데이터를 0으로 바꾸어버린다.