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  (파일의 끝 기준)

 

//너무 급해서 별 생각없이 적었습니다. 태클 많이 걸어주세요.