2011년6월29일_예제p11-10, 구조체(메모리) → 파일로 기록하여 RAW DATA분석
버퍼(Buffer) |
● HexaView로 읽어 들인 File의 Binary값은 하드디스크의 실제 데이터인가? 답: 아니다.
하드디크스에 있는 모든 데이터가 아닌 read()로 가공되어 나온 데이터가 Buffer에 저장이 되고 후에 write()로 모니터에 출력.
write()로 모니터에 출력할 때도 버퍼의 값이 아닌 다른 여러 값이 섞여 있을 수 있다.
● 로딩(Loading) : 하드디스크 –> 메모리에 적재 시키는 일.
● 버퍼(Buffer) : 크기가 1Byte든 512Bytes든 모두 버퍼이다.
● 이더넷버퍼(mtu) : 너무 작으면 다운 받는 파일이 조각이 많이 나서 느려진다. 온라인게임시 렉이 걸릴 수도 있다.
# ifconfig명령으로 확인해보면…
mtu값이 16436인 것을 알 수 있다.
mtu값을 200까지 낮추어 보니 업/다운 속도가 느려지고 온라인게임에서 응답속도는 빨라졌다.
버퍼의 사이즈를 줄이면 자주 왕복해야 하니 느려진다. 그렇다고 무진장 키운다고 빨라지는 것은 아니었다.
● 패킷(Packet) : 헤더 + window(데이터)
전송속도에 따라 window크기 가변.(슬라이딩 window)
● 워드같은 프로그램은 파일을 통채로 메모리에 로딩하니 버벅거리고 메모리를 많이 차지함.
왜 버퍼사이즈가 큰데 버벅거리는가? 사용자가 얼마나 큰 파일을 로딩할지 모르니 항상 모두 메모리에 올리므로 버벅거림.
임베디드C p.353 예제 p11-10 中 |
프로그램 시작 후 파일을 여는 부분…
1: //출력파일의 생성
2: if((outfd = creat("d11-10.out", S_IREAD | S_IWRITE)) < 0)
3: {
4: printf("file create error!\n");
5: return -1;
6: }
7:
8: close(outfd); //파일의 속성을 기록하기 위해서 닫음
9:
10: //출력파일을 쓰기 위해서 오픈
11: if((outfd = open("d11-10.out", O_WRONLY)) < 0)
12: {
13: printf("file open error!\n");
14: return -1;
15: }
2행 : creat( )로 파일을 열고,
8행 : close( )로 파일을 닫는다.
11행 : open( )로 다시 그 파일을 연다.
왜? creat( )로 파일을 생성 후 close( )로 닫고 open( )으로 다시 여는 이유는 무엇인가?
순서…
① 읽기와 쓰기허용 속성을 파일에 부여하며 생성 –rw
② 파일 닫음.
③ 쓰기전용으로 파일을 열기
내 생각…
open( )로 O_CREAT oflag를 사용하지 않고 열 때나,
touch명령처럼 파일 생성만 하고 싶을 때 creat( )를 사용하면 된다는 예제가 아닐까 생각된다.
리눅스파일속성은…
# chmod 777 [파일명]
chmod명령으로 파일의 속성을 바꿀 수 있으나 공유폴더에 있으면 사용자권한밖에 안되고,
/home 디렉토리에서 하니 기타사용자도 되었다.
● 예제 p11-10을 실행하여 입력한 값이 기록된 파일을 생성하고 HexaView로 열어 분석하자.
1, suman, 81/06/24
2, kuku, 06/05/11
3. lala, 89/12/06
데이터를 입력하여 파일에 기록한 뒤에 HexaView로 그 파일을 열어 보니 상기의 그림과 같이,
ID는 노란색 4Bytes,
name은 빨간색 20Bytes,
year, month, day 모두 각 4Bytes씩 총 12Bytes로 구성되어 있다는 것을 알 수 있다.
첫 번째 ID 1번만 보면 이름 옆에 09행에 00이라는 데이터가 기록되어 있다. 0x00은 NULL문자로 문자열의 끝을 나타낸다.
이 NULL문자 이후는 모두 쓰레기값이다.
두 번째 ID 2번을 보면 1번과 마찬가지로 똑같은 구조로 되어 있다는 것을 알 수 있다.
이런 데이터를 RAW데이터라고 부른다.
RAW DATA는 가공하지 않은 원데이터를 말한다.
// PE와 ELF구조체에 관한 이야기는 나중에…
순차접근방식과 임의접근방식 |
● 저수준 랜덤엑세스 함수
//file descriptor, offset값, 기준위치를 인자로 넘겨주면 파일커서의 위치가 바뀐다.
off_t lseek(int fildes, off_t offset, int whence);
SEEK_SET 변위는 offset바이트로 설정 (파일시작점기준)
SEEK_CUR 변위는 현재위치 + offset (현재 커서위치 기준)
SEEK_END 변위는 파일크기 + offset (파일의 끝 기준)
//너무 급해서 별 생각없이 적었습니다. 태클 많이 걸어주세요.