'C'에 해당되는 글 27건

  1. 2008.02.02 좋은 프로그래밍 습관이란 책을 읽고.
  2. 2008.01.24 오늘 할짓 없어서 한 뻘짓. 4
  3. 2007.07.01 메모리 직접 접근의 유용성 (memcpy) 3
  4. 2007.06.28 리눅스에서 2기가 이상인 파일에 접근하기 4
  5. 2007.06.17 MBR(?) 출력 하기 2

좋은 프로그래밍 습관이란 책을 읽고.

뭐 뒷면 책 내용 소개하는것중에 딱 마음에 드는게 하나(아래 printf) 있어서 도서관에서 이책을 빌렸네여..

중간에 이야기 몇몇 적어논것도 볼까 싶어서.....

제대로 볼시간이 없어서 걍 빌렸는데..

수준은...막 C땐 사람들 한테 딱 맞을듯하고요....

C복습한다고 새책 뒤지지말고 걍 이책 읽어보는것도 괜찮을것 같네요...

어지간한 C 주의할점 은 그대로 적어놨으니까.........

(적어도 이블로그를 고정적으로 방문하는 여러분께서는 볼필요가 없으실걸요,, 플밍에 관련되시는분..

현업뛰는 삭후님이나....팬터맨탈 읽으시는 환옹이나... 학교프로젝트 뛰시는 헤즐넛님이나 뭐.. 이책은 껌일듯..)

그래도 이책일고 딱 3개 정도 새로운 사실을 알아낸게 있는데

1 printf("[%s - %s] : %d\n",_FILE_,_FUNCTION__,_LINE_); 을 쓰면 편하다
그럼 [network.c - Get_Socket_Data] : 71 뭐 이런식으로 출력된다.
#define DEBUG_LINE_CHECK 위에저프린트문
요로케 해너으면 편하겠구나 싶었는데.....막상 써먹어볼려니... 당장은 없네...

2 enum 문 초기화방법..
enum문 쓰는건 알았는데 이렇게 초기화 하는 방법은 몰랐다능..(바본가?)
(왜? 제대로 쓴적이 없으니 이것도 많이 쓸 필요가 있어야 쓰지..)
책에 따르면
enum {
    KOREA = 10;
    ENGLAND,
};
뭐 이렇게 하면 KOREA = 10,ENGLAND = 11 이 된다고 합니다..
#define한게 겹칠수 있으니까 이렇게 쓰셈.. 이라고 합니다 책은........
근디.. 내가 open-source 프로그램을 몇개(많은게 아니라..) 뒤져봤었느데 말이에요,
어지간한건 걍 #define하지 (꽤 갯수가 된거 같은데.) 저렇게 enum쓰는건 첨보네요.
좋긴한데 구테여 define하는걸 enum으로 바뀔 필요는 없을듯하네요..
뭐 그냥 새로운걸 새로 알았다고 해야할까..............

3 파일포인터
나에게는 그져 존재감만 있는 그런놈..
실제로 써본적은.. 딱 한번인가 밖에 없네요...
어디에서 쓴건데 기억은 안나지만... 뭐 암튼 복습한다는 치고 읽어본.

오늘 할짓 없어서 한 뻘짓.

사용자 삽입 이미지

Rss에서 신비로 게시판 올라온 자료들 확인할수 있게 conky에 추가!

(실시간 다운을 위해서??)

일단 그냥 따로 실행파일 만들어서 설정파일에서 따로 명령을 실행시키게 만들어놨다

execl인가  뭐 그걸로..

음.....C로 했는데 다해놓고 보니까 그냥 쉘 스크립트로 할수도 있겠구나 싶었다..

(맞다! curl도 있구나!)

wget으로 받은다음 sed같은거 써서 출력하게 해도 됬었을 텐데

괜히 소켓쓰고 파일받고 문자열 파싱한다고 뻘짓했다..............

(뭐 로케일 변환 빼면 전에 다 만든거라 새루 한건 별루없;;)

그러고보니,,,,,,,,아 오늘이 아니고 인제 어제구나...........

포스팅은 해야겠고 올릴글은 업ㅂ어서 ...

메모리 직접 접근의 유용성 (memcpy)


Before
전형적인 막장짓..
초기화 -> 거꾸로 값 받아서 배열에 삽입 -> 포맷에 맞게 sprintf를 써서 -> 문자열로 만들고
-> 그걸다시 sscanf써서 -> 정수로 변환후 -> 리턴..
unsigned int  atox(char *string)

     unsigned int ret;

     sscanf(string,"%x",&ret);

    return ret;
}

 unsigned int get_value(unsigned char *segment,int offset,int size)
{
    int i;
    char temp[size * 2 + 1];
    unsigned char dt[size];
    temp[size * 2] = '\0';

    for(i = 0;i < size;i ++)
        /* 리틀 엔디언 */
        dt[size - i - 1] = *(segment + offset + i);

    if(size == 1)
        sprintf(temp,"%02x",dt[0]);
    else if(size == 2)
        sprintf(temp,"%02x%02x",dt[0],dt[1]);
    else if(size == 3)
        sprintf(temp,"%02x%02x%02x",dt[0],dt[1],dt[2]);
    else if(size == 4)
        sprintf(temp,"%02x%02x%02x%02x",dt[0],dt[1],dt[2],dt[3]);

    return atox(temp);
}

After
몰라 걍 직접 집어넣어 버려....; 왜 진작 이걸 생각 못했을까?
역시 메모리에 직접 접근해서 하는게 더 편하다.
unsigned int get_value(unsigned char *segment,int offset,int size)
{
    int ts = 0;
  
    memcpy(&ts,segment + offset,size);

    return ts;
}

비슷하게 잘 작동하는듯 하다.... 좀 이상한가... 바꾸고 나니 왠지 불안하다...
값은 제대로 찍히는거 같은데.................

아 size가 클경우 overflow가 일어날수도 있을거 같은데.. 그거 처리도 해야하나?
근데...귀차나연...ㅋ

리눅스에서 2기가 이상인 파일에 접근하기


도스 테이블을 만지작거리는중.

이상하게 값들이 제대로 안들어가는거 같아서.. long long 의 형까지 써보면서 삽질을 해봤지만

안되길래 구글링.... 한 결과

"open,lseek,fopen같은 함수는 2G정도의 파일만 접근이 가능하다.."

는 걸 알아냈다..............

아마도  off_t 값의 범위 때문에 그럴지도?

해결방법은

open64,lseek64처럼 직접소스에 64를 추가시켜주거나

(이때는 따로 인클루드파일을 추가시켜주거나 OR   DEFINE을 해줘야하는듯)

D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64

를 Gcc컴파일할때 추가해주면 된다  (gcc 버전 3.4부터 된다는 말이 있는데?)

이리하면

/dev/hda같은 대용량 파일(?) 도 잘 처리가 된다..

MBR(?) 출력 하기

 
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <sys/types.h>
 4 #include <unistd.h>
 5 #include <sys/stat.h>
 6 #include <fcntl.h>
 7
 8 #define MBR_SIZE 51
2
 9
10 void print_title(void)
11 {
12     printf("OFFSET    0  1  2  3  4  5  6  7  8  9  "
13             "A  B  C  D  E  F     ASCII CODE\n");
14 }
15
16 void print_hex(unsigned char *data)
17 {
18     int i;
19
20     for(i = 0;i < 16;i ++)
21         printf("%02x ",data[i]);
22 }
23
24 void print_offset(int i)
25 {
26     printf("%08x  ",i);
27 }
28
29 void print_charecter(unsigned char *data)
30 {
31     int i;
32
33     for(i = 0;i < 16;i ++){
34         if(data[i] > 32 && data[i] < 127)
35             printf("%c",data[i]);
36         else
37             printf(".");
38     }
39 }
40
41 int main(int argc,char *argv[])
42 {
43     int fd,i;
44     unsigned char data_sav[MBR_SIZE];
45
46     if(argc !=
2){
47         printf("Usage : %s /dev/hda \n",argv[0]);
48         exit(0);
49     }
50
51     if((fd = open(argv[1],O_RDONLY)) == -1){
52         perror("파일디스크립터 열기 실패");
53         exit(1);
54     }
55
56     if(read(fd,data_sav,MBR_SIZE) == -1){
57         perror("장치 읽기 실패");
58         exit(1);
59     }
60
61     print_title();
62
63     for(i = 0;i < MBR_SIZE;i +=16){
64         print_offset(i);
65         print_hex(&data_sav[i]);
66         print_charecter(&data_sav[i]);
67         puts("");
68     }
69
70     close(fd);
71     return 0;
72 }

임베디드 계발자를 위한 파일시스템의 원리와 실습
이란 책에서 MBR을 보여주는 젤처음 예제(아마도) 를 리눅이용으로 변신시켜본것입니다..

의외로 별루 안어렵고 쉽게 끝냈네여....
중간에 unsinged를 안써서 값이 이상하게 나와서 약간 고생했지만..
다행이도 값들이 ffff들이 친절히 나와주었기 때문에 쉽게 고칠수 있었습니다
(사실 거의 안써서 (...) 바로 감은 안오더라고요)
슈퍼유저만 장치에 읽기에 가능하니까 해서 따로 루트인지 검사하고 에러메세지를 따로 낼까
하다가 귀차나서 (어짜피 열다가 에러 먹을테니까) 방치.

실은 여름방학때 파워손님이 스터디를 제안해서.. 그거 따라 갈려고(...........)
하는거.......................입니다...
물론 디바이스프로그래밍이나 커널프로그래밍이니 아는건 거의 없습니다만 ;;
해서 손해볼건 없다 싶어서..... 방학때 같이 하는것도 괜찮을거 같고...

사실 어제 이거에 관련되서 약간 물어봤더랍니다..
각 섹터에 있는 값들을 어떻게 읽어 내느냐... 이렇게요..
그리고 책에서는 winapi로 하는데 리눅스에서는 어떻게.. 함수가 있나.. 이런식으로요
저는 뭐 어셈블러써서 어떻게 접근이 안될까 생각했는데
간단하게 대답해주시더군요

"그냥 /dev/hda 같은식으로 읽으면,........."

아!! 그랬죠,... 리눅스(유닉스계열) 은 시스템 장치들도 다 파일 처럼 사용하는 거였지 (.......;; )

그거 딱 생각하고서 그냥 만든겁니다..

잘 보시면 아시겠지만
핵심은 그냥 파일 읽는거랑 별반 다를거 없다는거.....

아마 저 크기가 아닐거 같은데... 뭐 대충 찍어요...
어짜피 숫자만 바꿔주면 되는데뭘...

'Programming > System' 카테고리의 다른 글

부트섹터에서 프로그램 실행시키기.  (14) 2007.07.21
압축플때 쓰는 쉘 스크립트  (4) 2007.06.18
screen attach dettach 구별법  (2) 2007.02.12
Beginning Linux Programming Part6-Curses  (2) 2006.06.25
ls -al  (0) 2006.06.21
prev 1 2 3 4 5 6 next