보안 실습/linux

fopen, fclose 와같은 시스템 호출을 이용한 함수

이수민 2023. 3. 9. 20:47

#include<stdio.h> 를 했을 때 사용할 수 있던 함수들

fopen, fclose, fread, fwrite, fseek, fgetc, fgets,fputc,fputs,fprintf,fscanf...

fopen - open

fclose - close

fread, fgetc, fgets,fscanf - read호출

fwrite,fputc,fputs,fprintf - write 호출

fseek - lseek 호출

이 함수들은 위의 시스템 호출들을 이용해서 구현한 함수들임

fopen,

fclose,

fread,

fwrite,

fseek,

fgetc, : 읽어들일 문자가 있을 경우 읽어들인 문자를 반환, 없을 경우 EOF 반환

fgets,

fputc, : 인자로 주어진 문자를 fp가 나타내는 파일로 출력하고 C를 반환한다. 오류 발생시 EOF 반환

fputs,

fprintf, - fwrite 랑 다른점은 얘는 눈에 보이게 써지는거고 fwrite는 바이너리로 써져서 안보여

fscanf

stdio.h에 있는 함수는 버퍼를 사용한 입출력을 한다.

버퍼란? 메모리 공간.

fputc(c) 하면 --> 버퍼에 차곡차곡 채워지다가 --> 디스크에 저장

fputs 하면 --> 버퍼에 한 라인씩 채워지다가 --> 디스크에 저장됨

이 버퍼라는 공간이 유한하기 때문에 가득 차게 될 때, 비로소 디스크에 쓰게 되는 것 : 효율을 위해서임

메인메모리에 버퍼공간 마련함. 왜냐면 disk 보다 빠르니까.

읽는 것도 비슷해

fgetc() --> 한글자씩 return 하는거 비효율 적이잖아? 그렇기 떄문에

메인 메모리에 버퍼공간을 마련해두고,

디스크에 가서 버퍼 크기만큼 채워넣어.

그리고 이것을 fgetc 마다 버퍼에 있는 글자를 하나씩 읽는겨

fgets()면 버퍼에서 한 라인씩 읽어들임

가져가다 보면 버퍼 다 가져가겠지? 그러면 버퍼는 다시 디스크 가서 그다음 버퍼 사이즈 만큼 읽어서 채워둠

효율적인 io를 위해서 표준io 함수는 버퍼를 사용한다.

디스크에 있는 거면 fully buffered io를 함

터미널 창에서 std io를 하는거면

line buffered io을 함 이건 \n있을때 출력하는 거 fputc(c,stdout)

글치먼 stderr은 버퍼 없어 다만 리다이랙션 쓰면 버퍼 써.

dup 파일 복사

#include<unistd.h>

0, 1, 2 번의 파일 기술자가 모든 프로세스에게 제공되던 거야.

0번은 표준 입력, 1번 표준 출력, 2번 표준 오류

파일 기술자를 나타내는 테이블을 스캔하다가 제일 처음 나타나는 빈 자리에 넣음

fd1=open("a",O_RDONLY);

fd2=dup(fd1);

read(fd1,buf,bufsize);

read(fd2,buf,bufsize);