fopen, fclose 와같은 시스템 호출을 이용한 함수
#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);