'Programming/System'에 해당되는 글 13건

  1. 2007.07.21 부트섹터에서 프로그램 실행시키기. 14
  2. 2007.06.18 압축플때 쓰는 쉘 스크립트 4
  3. 2007.06.17 MBR(?) 출력 하기 2
  4. 2007.02.12 screen attach dettach 구별법 2
  5. 2006.06.25 Beginning Linux Programming Part6-Curses 2

부트섹터에서 프로그램 실행시키기.

;파일 시스템을 배운 보람(?) 이 있습니다..
;저기 FAT12다루는 부분.. FAT16이랑 비슷합니다..
;파일시스템도 fat만 거의 다 끝내놓고 더이상 진적이 없는..
;과연 스터디는 할수 있을지..
;모책을 보고 있는 예제를 혼자서 비스므리 하게 짜봤습니다
;모르는 부분은 상당히 보고 했으므로 비슷한 부분이 많을듯.
;nask라는 이상한(?) 어셈블러로 해서 nasm이랑 약간 문법이 틀린데가 있습니다
;resb는 nasm의 times로 어떻게 대체 가능한합니다.
;부트섹터에서 부트섹터 외에 있는 프로그램으로 이동시켜서 실행하게 해주는 프로그램이
;부트로더인모양? 초보라 잘 모르겠네요.
;개인 기억용, 틀려도 절대 책임같은건 지지 않음..(아마 틀린거 많을걸?)
;영어에 태클 걸지 말것!

부연설명 (잊어버릴까봐..)
mov ax,0 ; ax = 0
int 0x10  ;번호에 해당하는 인터럽트 발생
(쉽게 말해 ax,bx,cx,dx,같은게 인자고 이걸사용하면 함수를 부르는거라 생각하면 될듯)

inc  ax   ; ax ++
dec ax    ; ax--
add ax,3  ; ax = ax + 3
sub ax,3  ; ax = ax - 3

cmp ax,3  ; if문, ax가 (뒤에 따라 점프)
jmp lable; goto label
jc        : jump carry,에러가 난다면.. 점프
je        ; jump equal 같으면 점프
jb        ; jemp below 작으면 점프
jbe       ; jemp below equal 작거나 같으면 점프
jnc       ; jemp not carry

db        ; byte (db 0x00 이면 현재위치에 1byte 만큼 0을 쓴다 라는 뜻인듯)
dw        ;word  (마찬가지)
dd        ; double word (마찬가지)

[]         ; c와 같다(배열과 포인터에 나오는 그거임... *(변수))
$          ; 현재 위치
resb      ; 0로 범위까지 채운다 (nasm에는 없음 times로 대체)

;main
;Program start place
ORG 0x7c00

;#define READ_CYRINDERS 10
READ_CYLINDER EQU 10

;FAT12 Boot record setting
jmp init_register       ;Jump boot code (3byte)
db  0x90                 ;padding (jump boot code)
db  "Lowid   "           ;OEM Name (8byte)
dw  512                  ;Bytes per secter
db  1                     ;Secter per Cluster
dw  1                     ;Reserved Secter count
db  2                     ;Number of fats
dw  224                  ;Boot entry count
dw  2880                ;Total secter 16
db  0xf0                 ;Media(now,floppy disk)
dw  9                    ;Fat size 16
dw  18                   ;Sector per track
dw  2                    ;Number of heads
dd  0                    ;Hidden secter    (no use partition)
dd  2280                ;Total secter32?? (drive size)
db  0                    ;Drive Number
db  0                    ;Reseved1
db  0x29                ;Boot signature(must 0x29?)
dd  0xffffffff        ;Volume serial num??
db  "Lowid_vol  "       ;Volume label (11byte)
db  "FAT12   "          ;Filesystem Type (8byte)
resb 18

init_register:
    mov ax,0
    mov sp,0x7c00
    mov ds,ax
    mov ss,ax

;(Read)Segment + offset
    mov ax,0x0820
    mov es,ax
    mov bx,0

;init_CHS
    mov ch,0    ;Cyrinder
    mov dh,0    ;Head
    mov cl,2    ;Sector

init_di_register:
    mov di,0    ;error count

read_disk:
    mov ah,0x02 ;read_mode
    mov al,1    ;read secter size
    mov dl,0    ;drive
    int 0x13    ;disk nterrupt

    jnc succeed ;no error.. jump (read)succeed

    ;error
    inc di      ;di ++
    cmp di,5    ;if 5
    je error    ;equal.. goto error

    jmp read_disk

print:
    mov al,[si] ;print character
    mov ah,0x0e ;mode
    mov bh,0x15 ;color
    int 0x10    ;video interrupt

    inc si
    cmp al,0
    je finish

    jmp print

error:
    mov si,error_string
    jmp print

;MAX(floppy disk?) - cylinder:40, head:2 sector:18
;cylinder:0 head:0 sector:1
;cylinder:0 head:0 sector:2
;cylinder:0 head:0 sector:3
;         .......
;cylinder:0 head:0 sector:17
;cylinder:0 head:0 sector:18
;cylinder:0 head:1 sector:1
;cylinder:0 head:1 secter:2
;         .......
;cylinder:0 head:1 secter:17
;cylinder:0 head:1 secter:18
;cylinder:1 head:0 secter:1

succeed:
;Move Segment and offset
    mov ax,es
    add ax,512/16
    mov es,ax
;Read 18 secter
    inc cl
    cmp cl,18
    jbe init_di_register
;Read 2 head
    mov cl,0    ;init secter
    inc dh
    cmp dh,2
    jb  init_di_register
;Read 10 cylinder
    mov dh,0    ;init head
    inc ch
    cmp ch,READ_CYLINDER
    jb  init_di_register
;All compleate!.. print succeed
    mov si,succeed_string
    jmp print

;jemp! (video file)
finish:
    jmp 0xc200

error_string:
    db "Read Failed - Check please!!"
    db 0x0a,0x00

succeed_string:
    db "Read Succeed - Check OK !!"
    db 0x0a,0x00

    ;for Dos Table Signature
    resb 0x7dfe - $ ;padding(0)
    db 0x55,0xaa    ;Dos Table Signature

;video
ORG 0xc200

;VGA 320x200x8bit
mov al,0x13
mov ah,0x00
int 0x10

finish:
    hlt
    jmp finish

압축플때 쓰는 쉘 스크립트

 1 #!/bin/bash
 2
 3 # 지원하는 파일들은 다음과 같습니다
 4 # zip,alz,rar,tar.gz,tar,tar.bz2,gz,tgz
 5 # 물론 unalz,unzip,unrar,tar등이 설치되어 있어야 합니다
 6 # (첫번째 인자의)파일의 확장자를 찾아내서 처리합니다..
 7
 8 # IFS 인자를 백업후 .을 IFS인자로 설정
 9 OLD_IFS=$IFS
10 IFS='.'
11
12 # 첫번째 인자를 변수에 넣고 .을 간격자로한 갯수를 구한다
13 ARG1=($1)
14 ARRAY_SIZE=$(expr ${#ARG1[*]} - 1)
15
16 if (( $ARRAY_SIZE == -1));then
17     echo "인자가 부족합니다.."
18     echo "사용법 : $0 파일명 (압축을 )경로"
19     exit 1
20 fi
21
22 # 파일의 확장자를 정한다 (맨뒤에꺼만 아면 된다
23 # tar.gz같은경우도 gz면 되기때문에 맨마지막만 검사한다
24 if [ "${ARG1[$ARRAY_SIZE]}" = "zip" ];then
25     EXTENSION="zip"
26 elif [ "${ARG1[$ARRAY_SIZE]}" = "rar" ];then
27     EXTENSION="rar"
28 elif [ "${ARG1[$ARRAY_SIZE]}" = "alz" ];then
29     EXTENSION="alz"
30 elif [ "${ARG1[$ARRAY_SIZE]}" = "tar" ];then
31     EXTENSION="tar"
32 elif [ "${ARG1[$ARRAY_SIZE]}" = "gz" ];then
33     EXTENSION="gz"
34 elif [ "${ARG1[$ARRAY_SIZE]}" = "tgz" ];then
35     EXTENSION="tgz"
36 elif [ "${ARG1[$ARRAY_SIZE]}" = "bz2" ];then
37     EXTENSION="bz2"
38 else
39     echo "지원되지 않는 압축파일입니다 확장자를 확인해 주세요!"
40     echo "지원되는 압축파일 : ZIP,RAR,ALZ,TAR,GZ(or tar.gz),BZ2(or tar.bz2)"
41     exit 1
42 fi
43
44 # IFS를 복원
45 IFS=$OLDIFS
46
47 # IFS를 복원했기때문에 원래 인자들이 대입된다
48 # 그리고 전체 인자 갯수를 구해서, 압축을 풀
49 # 장소가 command 에 있는지 검사하고 실행한다
50 ARG1=($1)
51 ARG2=($2)
52 ARG_NUM=$#
53
54 # (경로)인자가 존재하지 않는다면
55 if(($ARG_NUM == 1));then
56     if [ "$EXTENSION" = "zip" ];then
57         unzip $ARG1
58     elif [ "$EXTENSION" = "rar" ];then
59         unrar e -d $ARG1
60     elif [ "$EXTENSION" = "alz" ];then
61         unalz $ARG1
62     elif [ "$EXTENSION" = "tar" ];then
63         tar -xvf $ARG1
64     elif [ "$EXTENSION" = "gz" ];then
65         tar -xvzf $ARG1
66     elif [ "$EXTENSION" = "tgz" ];then
67         tar -xvzf $ARG1
68     elif [ "$EXTENSION" = "bz2" ];then
69         tar -xvjf $ARG1
70     fi
71 # 존재한다면 경로대로 압축을 해제시킨다
72 elif(($ARG_NUM == 2));then
73     if [ "$EXTENSION" = "zip" ];then
74         unzip $ARG1 -d $ARG2
75     elif [ "$EXTENSION" = "rar" ];then
76         unrar x $ARG1
77     elif [ "$EXTENSION" = "alz" ];then
78         unalz $ARG1 $ARG2
79     elif [ "$EXTENSION" = "tar" ];then
80         tar -xvf $ARG1 -C $ARG2
81     elif [ "$EXTENSION" = "gz" ];then
82         tar -xvzf $ARG1 -C $ARG2
83     elif [ "$EXTENSION" = "tgz" ];then
84         tar -xvzf $ARG1 -C $ARG2
85     elif [ "$EXTENSION" = "bz2" ];then
86         tar -xvjf $ARG1 -C $ARG2
87     fi
88 fi

간단한(?) 스크립트.
여러 압축파일을 풀때 사용합니다
제가 워낙 다운족이다보니 압축은 안하고 풀기만 합니다...
리눅스인만큼 tar.gz 같은 파일 도 많이 풀지만
애니 자막을 풀기도 하기 때문에 zip,rar,같은것두 사용해서 적어 놨습니다

사실 그냥  alias로 해결하곤 했는데 인제 ut uz ur 쓰는것도 귀찮아져서 그냥
한번에 할려구 그냥 쉘 스크립트를 하나 만든거에요..

tar.gz tar.bz2같은거 때문에 확장자 뻘짓고생을 했것만.. 어짜피 마지막 확장자로
압축을 푸니까 별로 중요하지 않더라는..

음.. 일단 그리고 인자가 없을때만 한번 테스트 해봤더니 그건 잘 돌아가는군요
.. 압축풀 경로를 정했을때는 테스트를 안해봐서 잘 모르겠습니다만.........;;;;
잘되겠져멀~~~~~~~(무책임 =3=3)
오랜만에 쉘스크립트를 만들다보니까 잘 적응이 안되서 또 해멨지만..( 무지하게)

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

screen attach dettach 구별법

/tmp/screen/-S-$USER/의 fifo파일의
mode상태를 보면된다
퍼며션에 access mode가 되있으면 (x,700) attach
안되잇으면 dettach다(600)
이거안다고 screen 솟스 뒤짐 ㅜ.ㅜ
조금만 관찰 해보면 알수 있었을 텐데..
아주 fifo쓰기하고 뻘짓을함..
역시 소스 보기가 제일이야 ㅠ

file>socket.c

277 /*
278 * mode 600: socket is detached.
279 * mode 700: socket is attached.
280 * xflag implies rflag here.
281 *
282 * fail, when socket mode mode is not 600 or 700
283 * fail, when we want to detach w/o reattach, but it already is detached.
284 * fail, when we only want to attach, but mode 700 and not xflag.
285 * fail, if none of dflag, rflag, xflag is set.
아 역시 지금까지 이거 함수 만드는거 한건 뻘짓이였어.................................

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

압축플때 쓰는 쉘 스크립트  (4) 2007.06.18
MBR(?) 출력 하기  (2) 2007.06.17
Beginning Linux Programming Part6-Curses  (2) 2006.06.25
ls -al  (0) 2006.06.21
Beginning linux programming  (6) 2006.03.01

Beginning Linux Programming Part6-Curses

여기서 윈도우라는건 콘솔에서 하는겁니당..
터미널 상에서 상자만드는것이죠
GTK,QT,API 이런거 아닙니다..

C대충 아시는 분은 뭐하는지 아실겝니다..
어짜피 다른거라고 해봤자 함수좀 쓰는거니까..
Curses는 도스랑도 꽤나 비슷한가 보군요 구글링 하니까 비슷하더라는..

다음은 요약본

*******윈도우 속성*************

#include<curses.h>

WINDOW initscr(void); //윈도우를 연다
int endwin(void); //윈도우를 닫는다

int move(int x,int y) //커서를 이동한다 x,y 좌표에 따라서,도스의 gotoxy랑 하는짓?은 비슷하다
printw(char *format...)//걍 문자열 출력 일반적 윈도우에서 쓰는 printf 라고 생각하자

int refresh(void);화면 다시 쓰기 (화면 새로 고침)

attron(chtype attribute);//해당 문자 속성을 켠다(A_BOLD,A_UNDERLINE,A_REVERSE.....)
attroff(chtype attribute);//해당 문자 속성을 끈다(옵션은 같이 붙여주면 됨)

ex>
     7     initscr();//윈도우 시작
     8
     9     move(10,10);//Move..
    10     printw("MAC vs Windows");//글자
    11     refresh();//화면 reflash 해야 글자가 보임
    12     sleep(1);
    48
    49     endwin();//윈도우 종료

*아래에 해당되는 함수는 윈도우의 시작과 끝 사이에 위치해야한다
(initscr();~endwin() 사이에)

int echo(void)//echo 켜기(print)
int noecho(void)//echo 끄기
int cbreak(void)//글자를 누르자 마자 직접 반응
int nocbreak(void)//cbreak 끄기
int raw(void) //특수문자 처리가 꺼짐(방향키등)
int noraw(void)//특수문자 처리가 가능

int getch(void) //설명이 필요 없다
int getstr(char *string) //문자열을 입력받는다
int getnstr(char *string,int stringsize)//n개의 문자를 입력받는다(Bufferoverflow 방지)
(strncmp memnset 같은 n 종류)

******Window 건드리기********

기본적인 순서는
1윈도우를 정의한다
2윈도우에 출력할 내용을 정한다
3표준화면에 윈도우를 적용한다

ex>

    10     WINDOW *win1,*win2;//윈도우 구조체 선언(직접 건들진 못한다)
    ....
    24     win1=newwin(10,20,15,12); //새창의 윈도우
    25     mvwprintw(win1,2,2,"%s","Hello World! ");//들어갈 내용
    26
    27     win2=newwin(30,30,30,30);
    28     mvwprintw(win2,2,3,"%s","ABCDEF~");
    29
    30     wrefresh(win2);
    31     wrefresh(win1);//화면에 적용

아까 printw를 예로들자면
wprintw(WINDOW *winpointer,char *format,...);
mvprintw(int x,int y,char *format,...);
mvwprintw(WINDOW *winpointer,int y,int x,char *format,...);

w->WINDOW 포인터
mv->window mv(이동)
mvw->위에꺼 두개 합친것

box(WINDOW *winpointer,char x,char y) ?
상자를 만든다 x,y에다가는 각 테두리를 장식할 문자를 정해주면 된다

*******키패드**********

보통 initscr 했을때 키패드는 이스케이프 문자를 잠근다고 한다
이것을 풀기위해선
keypad()함수를 사용하면 된다

int keypad(WINDOW *winpoiter,TRUE/FALSE);
TRUE,FALSE 중 하나를 택하여 키패드 모드을 on/off한다
뭐 특별히 정해줄거 없으면 stdscr으로 해도 된다

보통 getch();로 받아서 이것을 swich문으로 Check하는데
거기서 키패드가 뭐가 눌렸는지 알수 있는 매크로는 다음과 같다

LOCAL_ESCAPE_KEY
KEY_UP,KEY_DOWN,KEY_RIGHT,KEY_LEFT
KEY_END,KEY_BEG
척 보면 다 아니깐 설명은 생략

ex> 설명은 귀찮아서 안해
    14     do
    15     {
    16         mvprintw(10,15,"UP DOWN RIGHT LEFT Press Key....:");
    17         refresh();
    18
    19         ch=getch();
    20
    21         clear();
    22         move(10,50);
    23
    24         if(ch>='a' && ch <='z')
    25             printw("%c",(char)ch);
    26         else if(ch>='A' && ch <='Z')
    27             printw("%c",(char)ch);
    28         else if(ch>='0' && ch <='9')
    29             printw("%c",(char)ch);
    30
    31         else
    32         switch(ch){
    33             case(KEY_RIGHT):
    34                 printw("RIGHT");
    35                 break;
    36             case(KEY_LEFT):
    37                 printw("LEFT");
    38                 break;
    39             case(KEY_UP):
    40                 printw("UP");
    41                 break;
    42             case(KEY_DOWN):
    43                 printw("DOWN");
    44                 break;
    45             default:
    46                 printw("KEY VALUE:%d",ch);
    47         }
    48
    49     }while(ch != 'q');

*************색깔(color)****************

소스를 보면서 설명

    18     has_colors(); //터미널이 색깔을 쓸수 있는지 확인
    19     start_color(); //색깔쓰기 시작 안되면 에러메세지

    20     init_pair(1,COLOR_RED,COLOR_BLACK); //여기서 부터 번호대로 색깔을 정의한다
    21     init_pair(2,COLOR_BLUE,COLOR_WHITE);
    22     init_pair(3,COLOR_CYAN,COLOR_YELLOW);
    23     init_pair(4,COLOR_GREEN,COLOR_RED);
    24     init_pair(5,COLOR_WHITE,COLOR_MAGENTA);
    25     init_pair(6,COLOR_BLACK,COLOR_WHITE);
    26     init_pair(7,COLOR_RED,COLOR_GREEN);
    27     init_pair(8,COLOR_MAGENTA,COLOR_CYAN);
//RED,BLACK..이런 건 아마 curses.h에 메크로로 존재하는거 같다~!

    29     for(i=1;i<9;i++){
    30         attrset(COLOR_PAIR(i) | A_BOLD);//
    31         //wattron(stdscr,COLOR_PAIR(i) | A_BOLD );
//일정 WINDOW 포인터에 적을때 사용지금은 그냥 stdscr이므로 위의 함수와 하는일이 같다

    32         mvprintw(13+i,10,"%s%d              %s%d",str1,i,str2,i);
//일정한 위치에 글자를 찍어라 앞에서도 봤던 함수 %d %s %c 같이  printf의 포맷과 비슷하다

    33         refresh(); //전에도 말했지만 변경사항을 적용할려면 refresh함수를 써야한다
    34         sleep(1); //바로 지나가므로 결과를 확인할수 있게 잠시 늦춤
    35     }

********** 패드 (pad) **************

에 그러니까.. 패드라는건.. 나도 뭔가 했는데..
책에서 논리화면 물리화면 어쩼네~ 이러는건.. 이해가 안되서..
내가 내맘대로 이해한게 화면을 쓸수 있는 범위랄까 .. 그런걸 지정한다고
해버림

WINDOW *newpad(int number_of_lines,int number_of_columns);
뭐.. 설명이 필요할까

#include<curses.h> //외워 버렸네..
int prefresh(WINDOW *pad-ptr,int pad_row,int pad_column,
                       int screen_row_min,int screen_col_min,
                       int screen_row_max,int screen_col_min)

아따 길다.. 뭐이리 길어... 이것도 다 적혀있으니깐 해설은 Pass~

ex> //설명이구 뭐구 할께 없다.. 그 자체
사실 나도 별내용 없는거 같아서 책 내용 그대로 쳐봤다..

    28     prefresh(pad,5,7,2,2,9,9);
    29     sleep(1);
    30
    31     prefresh(pad,LINES +5,COLS +7,5,5,21,19);
    32     sleep(1);
    33     delwin(pad); //윈도우를 지운다

뒤에 뭐 CD  응용프로그램 만든다고 하는데..
나는 갈길이 바뻐서.. 뭐 이것도 넘어가기로 한다

아~ 그러니깐 이번 파트 끝이넹.. 이것도 2틀이나 걸렸다..(터미널이랑 같다?)
정말 의외로 시간이 정말 오래 걸리는군... 하아.. 뭐.. 이정도 속도로가면 한 3주내에
빠르면 2주만에 끝낼수도 잇을텐데.. (뭐.. 빼먹을 부분이 좀 있는지라)

다음은 11장 프로세스~

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

MBR(?) 출력 하기  (2) 2007.06.17
screen attach dettach 구별법  (2) 2007.02.12
ls -al  (0) 2006.06.21
Beginning linux programming  (6) 2006.03.01
VIRUS 제작~  (6) 2006.01.03
prev 1 2 3 next