BLOG main image
분류 전체보기 (117)
Hidden (1)
five senses (0)
safe system (77)
code (35)
database (1)
Link (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
'분류 전체보기'에 해당되는 글 117건
2008. 8. 26. 05:00
Fast Note
http://www.kt2k.com
사용자 삽입 이미지



2008. 8. 15. 05:00
간단한 잠금기능 링크 파일입니다.
로그오프 기능이 아닌 화면잠금 기능입니다.

많은 사람들이 공간에서
사용하던 컴퓨터에서 잠시 자리를 비우게 될 때 "잠금~"....
2008. 8. 10. 05:00

Feature Tool
Version 2.11

The Feature Tool is a DOS-bootable tool for changing various ATA features. It can modify certain features of our Deskstar and Travelstar high-performance ATA hard disk drives and supports 48-bit addressing for new, large-capacity drives.

Downloads

Feature Tool User's GuideContains instructions for creating the bootable media under Windows and Linux, and information on how to use the program.
Diskette creator for Windows (1,692 K)
Click here if having trouble creating bootable diskette
Binary diskette image (for non-Windows OS) (1,440 K)
CD image  (2,598 K)
Create a bootable CD for Windows, Linux and other operating systems (requires CD-RW drive and software).
Notes

Does not support Travelstar 8E, 10E, or C4Kxx series HDDs, or drives mounted in external enclosures.
Features in Version 2.10

Supports the latest Deskstar and Travelstar HDDs.
Enhances Serial ATA (SATA) support.
Enhances capacity clip function.
Changes ATA Drive Settings

Enable or disable the read-ahead or write cache.
Change the drive automatic acoustic management settings. - Lowest acoustic emanation setting (quiet seek mode) or maximum performance level (normal seek mode).
Change the predefined capacity of the drive.
- Used when BIOS limitation exists and the drive is not recognized.
Switch the Ultra DMA mode.
Change advanced power mode.
- Switch between lowest and highest power consumption (maximum performance level).
Configure SATA interface.
- Adjust maximum speed and enable/disable spread spectrum clocking.

Warning! Switching your drive to support 3.0Gb/s, or enabling spread spectrum clocking and then using it, may render your drive unusable in a system that cannot support these functions. If in doubt, please contact your system manufacturer.
Shows Drive Temperature

Displays temperature in Celsius and Fahrenheit.





2008. 8. 7. 05:00
LinkStash
LinkStash is an outstanding bookmarks/favorites manager that works with Internet Explorer, Firefox, Netscape and Opera. Just 5 minutes with LinkStash and we are betting you will never want to use the Internet Explorer Favorites, Firefox, Netscape and Opera bookmarks again!
사용자 삽입 이미지


2008. 8. 7. 05:00
vim diff
사용자 삽입 이미지


winmerge
사용자 삽입 이미지


diff doc
사용자 삽입 이미지


2008. 8. 7. 05:00
Dependency Walker 2.2

Dependency Walker is a free utility that scans any 32-bit or 64-bit Windows module (exe, dll, ocx, sys, etc.) and builds a hierarchical tree diagram of all dependent modules. For each module found, it lists all the functions that are exported by that module, and which of those functions are actually being called by other modules. Another view displays the minimum set of required files, along with detailed information about each file including a full path to the file, base address, version numbers, machine type, debug information, and more.
사용자 삽입 이미지

2008. 8. 4. 05:00
IntelliStation M Pro 6849-54J
CPU : Intel Pentinum4 2GHz
RAM : RD-1024MB
VGA : ATI FireGL4 Pro 128MB DVIx2
HDD : SCSI 18.2GB
165x508x470mm
19.1Kg
OS :Windows 2000

사용자 삽입 이미지
사용자 삽입 이미지
2008. 7. 24. 05:00
Q10
http://baara.com/q10/

폰트 10 으로 사용하면 정말 깔끔하게 사용할 수 있는 에디터...

사용자 삽입 이미지


 

q10-1.2-spell.exe

 

q10-1.2-spell.zip

 

q10-1.2.paf.exe

2008. 7. 22. 05:00

다음을 사용하여 CD-R 또는 DVD-R장치를 찾는다.
#cdrecord -scanbus

다음과 같이 CD를 굽는다.
#cdrecord -v speed=속도 dev=찾아낸장치 iso파일명

예제
#cdrecord -v speed=4 dev=ATAPI:1,0,0 WXPVOL_EN.iso


▶ 커널에 EIDE CD-RW드라이브가 인식되었는지 확인
   #> ls -l /dev/cdrom
     lrwxr-xr-x 1 root root 9 9월 28 14:58 /dev/cdrom -> /dev/scd0

  #>dmesg
     SCSI subsystem driver Revesion : 1.00
     scsi0 : SCSI host adapter emulation for IDE ATAPI devices
     vendor: SAMSUNG    model: CD-R/RW SW-208B  Rev:BS04
     Type : CD-ROM  ANSI SCSI revision: 02

  #>cdrecord -scanbus
      Linux sg driver version: 3.1.22
      Using libscg version 'schily-0.7'
      scsibus0:
       0,0,0     0) 'SAMSUNG ' 'CD-R/RW SW-232B ' 'R300' Removable CD-ROM
       0,1,0     1) *
       0,2,0     2) *
       0,3,0     3) *
       0,4,0     4) *
       0,5,0     5) *

▶ HDD Data를  ISO이미지로 백업하기
#> mkisofs -R -o cdimage.iso /home/junix/
#> mkisofs -icode=cp949 -o test.iso -r -V TESTISO /mnt/movie/ani/
설명 : /home/junix/ 디렉토리를 cdimage.iso 라는 이름으로 이미지를 만듭니다.
-icode=cp949 : 한글 파일이름 인식 : mkisofs -icode help 참조
-o : 생성될 ISO 이미지 파일 이름
-J : Joliet, Rockridge 사용, 긴 파일의 이름이 가능해 진다.
-V : Volume ID 생성

▶ 굽기전에 CD 이미지(iso) 무결성 테스트
   - 이 기능을 이용해서 CD를 굽기전에 테스트 해볼 수 있다.
#> mount cdimage.iso -r -t iso9660 -o loop /mnt/cdr

▶ ISO 이미지를 공시디에 레코딩하기
#> cdrecord -v -eject speed=4 dev=0,0,0 -data cdimage.iso
      - dev 구조:  dev= scsibus, target, lun    [ dev=1,0 or dev=0,1,0 ]
                     ( 대개  scsibus는 0번이며 , 이경우 그냥 target 과 lun 부분만을 적어도 됨.)
      -  target :  자기 레코더의 ID 번호
                     ( 조회방법: cdrecord   -scanbus  또는    eject /dev/scd0  )
      -v           : 레코딩 정보를 상세 출력
      -eject     : 레코딩 후 디스크 배출
      speed=x : 레코딩 배속

▶  이미지를 HDD에 만들지 않고 바로 레코딩하기
#> mkisofs -R /home/backup | cdrecord -v speed=4 dev=1,0 - [enter]

2008. 7. 22. 05:00
 
사용법
네트워크 상에서 데이터를 다운로드 받는다. 유저와의 상호작용이 필요 없으므로 - non interactive - 자동화된 다운로더 시스템을 구성할 수 있다.

wget [option]... [URL]...
 
설명
GNU wget은 상호작용을 필요로 하지 않는 다운로드 프로그램으로 Web으로 부터 파일들을 가져올 수 있다.
HTTP, HTTPS, FTP 프로토콜을 지원하며, HTTp proxy에서 데이터를 가져올 수도 있다.
 

wget이 상호작용을 필요로 하지 않는다는 것은, 백그라운드 상태에서 작동할 수 있음을 의미한다.
사용자는 로그인을 하지 않은 상태에서도 cron이나 Damon을 이용 wget을 실행시킬 수 있다.
또한 cookie, Form action을 지원해서 사용자 액션을 시뮬레이션 할 수도 있다.
 

wget은 HTML과 XHTML 페이지를 다운로드 받아서 로컬 파일시스템에 저장한다.
이때 파일이름과 디렉토리 구조까지를 그대로 로컬시스템에 구축함으로써, backup, mirror 사이트 구축등에 사용할 수도 있다.
또한 recursive 다운로드를 지원해서, 사이트 전체를 쉽게 내려받을 수 있다.
 

wget은 느리거나 불안정한 네트워크 환경에서도 매우 잘 작동하는 견고한 프로그램이다.
네트워크 환경이 불안해서 도중에 연결이 끊겼다면, 연결이 끊긴 시점부터 다운로드 받는 기능도 가지고 있다.
 

옵션
Start Up
-V, --version
wget의 버전을 보여주고 종료한다.

-h, --help
도움말을 보여준다.

-b, --background
백그라운드에서 작동하도록 한다.
 
-e, --execute=COMMAND
.wgetrc를 읽어서 명령을 실행한다.

Logging and input file
-o, --output-file=FILE
메시지들을 파일로 남긴다.

-a, --append-output=FILE
메시지들을 파일에 추가한다
 
-d, --debug
디버그 내용을 출력한다.
 
-q, --quiet
메시지들을 표준출력하지 않는다.
 
-nv, --non-verbose
기본옵션을 제거한다.

-i, --input-file=FILE
다운로드 받을 URL주소를 파일에서 찾는다.
 
-F, --force-html
HTML과 같은 파일을 입력값으로 취급한다.

-B, --base=URL, --sslcertfile=FILE, --sslcertkey=KEYFILE
파일이나 링크들의 SSL인증을 위해서 URL, keyfile을 사용한다.
 
 
다운로드
--bind-address=ADDRESS
로컬 호스트의 주소를 설정한다.
 
-t, --tries=NUMBER
설정한 숫자 만큼 다시 시도한다. 0은 무한대
 
-O, --output-document=FILE
문서를 파일로 쓴다.
 
-c, --continue
연결이 끊긴 시점부터, 이어서 파일을 다운로드 받는다.
 
-N, --timestamping
로컬에 있는 것보다, 새롭지 않으면 파일을 다시 받지 않는다.
 
-S, --server-response
서버의 응답을 출력한다.

--spider
다운로드 하지 않는다.

-T, timeout=SECONDS
종료된 시간을 초단위로 설정한다.
 
-w, --wait=SECONDS
연결을 위해 기다리는 시간을 초단위로 설정한다.

-Y, --proxy=on/off
프락시 모드를 켜고 끈다.
 
-Q, --quota=NUMBER
숫자만큼 분담하도록 설정한다.
 

디렉토리 관리
-nd, --no-directories
디렉토리를 생성하지 않는다.
 
-x, --force-directories
디렉토리를 강제로 생성한다.
 
-nH, --no-host-directories
호스트 이름의 디렉토리를 생성하지 않는다.

-P, --directory-prefix=PREFIX
파일들이 저장될 디렉토리를 지정한다.
 

HTTP 옵션
--http-user=USER
http 유저 아이디를 설정한다.
 
--http-passwd=PASS
http 패스워드 암호를 설정한다.
 
-C, --cache=on/off
서버측의 캐쉬 데이터를 허용하는게 보통이나, 제거할 수도 있다.

-E, --html-extension
모든 text/html 형식의 문서들과 .html 파일을 같이 확장해서 저장한다.

-s, --save-headers
파일에 HTTP헤더를 저장한다.

-U, --user-agent=AGENT
Wget이 아닌, 다른 브라우저로 AGENT를 설정한다.

--no-http-keep-alive
HTTP의 keep-alive를 제거한다.

--cookies=off
cookie를 사용하지 않는다.

--load-cookies=FILE
쿠키의 값을 파일에서 읽어들인다.

--save-cookies=FILE
세션이 끝난 이후 전달받은 cookie값을 저장한다.

FTP 옵션
-nr, --dont-remove-listing
.listing 파일에 있는건 지우지 않는다.

-g, --glob=on/off
하나의 파일이름으로 할지를 결정한다.

--passive-ftp
passive 모드로 전송한다.
 
--retr-symlinks
복구중에 링크가 걸린 파일을 가져온다.

Recursive retrieval
-r, --recursive
웹데이터를 재귀적으로 가져온다. 대상 웹서버에 무리를 줄 수 있으니, 주의해서 사용해야 한다.
 
-l, --level=NUMBER
--delete-after
다운로드 받은후 로컬파일을 삭제한다.

-k, convert-links
관계없는 링크를 관련있는 링크로 변환한다.

-K, --backup-converted
변환하기 전에, 원본파일을 .orig 파일로 백업한다.
 
-m, --mirror
 
-r -N -l inf -nr 옵션과 사용할 수 있다.
 
-p, --page-requisites
모든 이미지와 HTML 페이지등을 가져온다.

Recursive accept/reject
-A, --accept=LIST
받아들일 것을 확장하기 위해서 콤마로 분리된 리스트로 받아들인다.

-R, --reject=LIST
받아들이지 않을 것을 콤마로 분리된 리스트로 받아들인다.
 
-D, --domains=LIST
받아들일 도메인을 콤마로 분리된 리스트로 받아들인다.
 
--exclude-domains=LIST
거절할 도메인을 콤마로 분리된 리스트로 받아들인다
 
--follow-ftp
HTML 문서에서의 FTP 링크를 따라간다

--follow-tags=LIST
HTML태그에서 따라갈 콤마로 분리된 리스트로 받아들인다.

-G, --ignor-tags
무시할 HTML 태그를 콤마로 분리된 리스트로 받아들인다.

-H, --span-hosts
반복할때에 다른 호스트로도 가게 한다.

-L, --relative
관계있는 링크만 따라간다.

-l, --include-directories=LIST
허용할 디렉토리를 리스트로 받아들인다.

-nh, --no-host-lookup
DNS의 검색 호스트를 사용하지 않는다.

-np, --no-parent
상위 디렉토리를 올라가지 않도록 한다.
 

참고문헌
커피닉스
명령어 라인의 진수
wget을 이용한 웹서버 성능측정
출처: http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/1/wget
 
 
2008. 7. 18. 05:00


http://www.popome.com/?p=28
2단계 : signal()

통신 프로그램 생각할때 먼저 떠올리는건 서버와 클라이언트 즉 리눅스와 윈도우 아니면 서버가 서버의 통신을 생각한다.
통신은 이렇게 두개의 프로그램 또는 다른 서버간에 통신뿐 아니라 1단계에서 말한 프로세서간 내부 통신도 매우 중요한 부분이다.

통신 프로그램을 짤때 단순히 클라이언트가 서버에 접속해서 데이타를 요청하고 받는 단순 구조인 경우라면 크게 신경을 안써도 되겠지만 만일 접속된 클라이언트간에 데이타를 주고 받는 상황이라면 내부 프로세서가 통신은 매우 중요한 부분이다.
게임 프로그램이나 메신저와 같이 클라이언트간에 데이타를 주고 받거나 또는 시스템 상에서 데몬의 종료나 환경 변수의 변경등을 알려주는 기능도 내부 통신이라고 할 수 있다.

아파치 웹서버의 파라메터나 도메인 정보가 바뀌었을때 데몬을 재 시작해도 상관없지만 보통의 경우는 killall -HUP httpd 이런식으로 해당 데몬에게 신호를 주는 방식도 있다.

내부 프로세서가 통신은 IPC라고 하는 칭하는데 3가지의 형태가 있다.
1. tcp, udp, pipe와 같이 데이타를 전송하는 방식
2. semaphore, mutex 와 같이 데이타 동기를 맞추는 방식
3. signal, wait 과 같이 신호를 전송하는 방식
더 많은 분류와 함수도 있겠지만 그 목적별로 나눈다면 위의 가지수가 될것이다.

이번에 설명하는 signal은 데모을 만들때 중요한 기능이므로 우선 설명하기로 한다.

예제 프로그램은 kill 호출이 되기전까지는 1초씩 기다리면서 무한루프를 도는 구조이다. SIGINT는 Ctrl+C를 막는 기능이고 SIGHUP은 일반적으로 프로그램에게 외부 환경 파일이 변경됨을 알려주는 기능으로 많이 사용한다. SIGTERM은 kill 신호를 받았을때 바로 죽지 않고 종료를 안전하게 처리하는 기능을 수행한다.

정확한 코딩방식으로는 signal로 받은 함수를 원상 복귀시키는 로직도 포함이 되어야 하지만 일반적으로 프로그램이 종료하면 자동 복귀가 되므로 생략하는 경우가 많다.

SIGCHILD는 fork로 생성된 프로세서가 종료될때 부모프로세서에게 종료됨을 알리고 부모가 wait도는 waitpid 형태의 함수를 호출해서 종료 상황을 인식할 수 있도록 프로그램을 짤 수 있다.

하지만 SIG_IGN 를 지정하면 해당 신호를 무시하여 간단히 처리하는것도 방법이다. 이렇게 처리하면 fork()로 생성된 child 가 종료시 defunct 형태로 ps 로 확인되는 zombi 프로세서의 생성을 자동적으로 처리해주는 기능을 수행하게 된다.

alarm 함수는 SIGALM을 호출하게 되어 타이머로서 이용할 수 있다.
block 모드로 동작하는 read, write, select 와 같은 함수에서 해당 기능을 이용하면 데이타 전송시 무한 대기로 빠지는 것을 방지할 수 있다.

단 kill -9 와 같이 강제 종료의 경우는 신호가 잡히지 않고 강제 종료가 되게 되므로 일반적인 kill 신호로 데몬을 종료시키면서 안전하게 종료하는 방법으로 개발해야 한다.

예제 프로그램을 실행하고나서 Ctrl+C 키를 누르거나 다른 텔넷창에서 kill -HUP process-id 과같이 테스트를 해볼 수 있다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h> 

int sig = 0; 

void sigRtn( int s )
{
    sig = s;
    printf( "Receive signal : %d", sig );

void main()
{
    signal( SIGINT,  sigRtn );
    signal( SIGHUP,  sigRtn );
    signal( SIGTERM, sigRtn );
    signal( SIGALRM, sigRtn );
    signal( SIGCHILD, SIG_IGN ); 

    alarm( 10 ); 

    while( sig != SIGTERM )
    {
        sleep( 1 );
    } 

    printf( "Receive kill" );
}

2008. 7. 18. 05:00


http://www.popome.com/?p=27

리눅스에서 TCP/IP 데몬 개발을 단계적으로 설명하고자 한다.

총 8단계에 걸쳐서 연재를 할 예정이고 각 단계별로 간단한 소스와 설명을 통해서 데몬 프로그램 기법을 정리할 예정이다.

모든 단계별 소스는 아주 간단하게 동작하도록 작성하였으나 보고 이해하기만 하면 절대로 그 의미를 100% 자신의 것으로 만들 수 없다. 앞으로 나오는 8단계는 영어 알파벳이라 생각하고 완젼히 외워야 한다. 복사해서 실행하지 말고 직접 타이핑 쳐서 컴파일 하기 바란다.

1단계 : fork()
2단계 : signal()
3단계 : thread
4단계 : 간단한 tcp 서버 데몬 #1
5단계 : 간단한 tcp 서버 데몬 #2
6단계 : 복수 클라이언트 접속용 tcp 서버 데몬 #1
7단계 : 복수 클라이언트 접속용 tcp 서버 데몬 #2
8단계 : 복수 클라이언트 접속용 tcp 서버 데몬 #3

물론 8단계가 완벽한 데몬형태가 되지는 않지만 8단계의 모든 소스를 조합한다면 충분히 완벽한 데몬을 제작하는데 어렵지 않을것이다.

1단계 : fork()

대부분의 네트웍 데몬을 공부하게 되면 가장 먼저 이해해야 하는 함수가 fork()다. 이 함수는 child processor를 생성하는 함수로 간단한 셈플을 아래 작성했다.

아래의 프로그램을 실행하면 재미있는 결과가 나올것이다.

물론 결과에서 프로세서 아이디에 해당하는 숫자(31332,31332) 는 실행하는 컴퓨터에 따라서 다르게 표시될것이다.

프로세서를 이해하지 못하는 사람이라면 if문으로 싸여진 출력문 중에서 조건이 맞는 하나만 출력되리라 생각되지만 실제로 실행결과는 두가지 모두 출력하게 된다.

하지만 fork() 위로는 출력문은 하나만 출력된다.
이는 fork() 가 호출되기 직전까지는 하나의 프로세서에서 fork()를 만나면서 두개의 프로세서로 나뉘어진다는 의미다.
손오공이 분신술로 2마리가 되는것과 같다.(^^)

fork()는 불려지는 순간 호출한 프로세서를 복제하게 되고 그 이후는 각각 따로 동작하게 된다는 점이 중요하다.

그래서 cnt값을 출격하는것이 Parent와 Child가 다르게 찍히게 되는것이다. Sleep이라는 함수를 이용해서 약간의 시간차 출력문으로 cnt의 변화값을 출력하게 되는데 초기 10의 값은 두 프로세서가 동일하게 가지고 있지만 부모프로세서는 중간에 0으로 변경을 하게 되어 마지막에 프로그램이 종료하는 순간 출력문은 10, 0 두가지 모두 출력하게 되는 것이다. 프로세서 번호를 따져보면 Parent와 Child가 초기에 같은 변수가 각각 따로 변함을 알게 된다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> 

void main( int argc, char *argv[] )
{
        int      cnt = 10;
        pid_t   pid; 

        printf( “Call fork()” ); 

        pid = fork(); 

        printf( “fork() : %d“, pid ); 

        if ( pid )      // parent
        {
                cnt = 0;
                printf( “This is parent : %d“, getpid() );
                sleep( 5 );
                printf( “server end” );
        }
        else
        {
                printf( “This is child : %d, %d“, getpid(), getppid() );
                sleep( 3 );
                printf( “child end” );
        } 

        printf( “End process : %d %d“, getpid(), cnt );
}

=======================================
Call fork()
fork() : 31332
fork() : 0
This is child : 31332, 31331
This is parent : 31331
child end
End process : 31332 10
server end
End process : 31331 0
======================================


2단계 : signal()


통신 프로그램 생각할때 먼저 떠올리는건 서버와 클라이언트 즉 리눅스와 윈도우 아니면 서버가 서버의 통신을 생각한다.

통신은 이렇게 두개의 프로그램 또는 다른 서버간에 통신뿐 아니라 1단계에서 말한 프로세서간 내부 통신도 매우 중요한 부분이다.


통신 프로그램을 짤때 단순히 클라이언트가 서버에 접속해서 데이타를 요청하고 받는 단순 구조인 경우라면 크게 신경을 안써도 되겠지만 만일 접속된 클라이언트간에 데이타를 주고 받는 상황이라면 내부 프로세서가 통신은 매우 중요한 부분이다.

게임 프로그램이나 메신저와 같이 클라이언트간에 데이타를 주고 받거나 또는 시스템 상에서 데몬의 종료나 환경 변수의 변경등을 알려주는 기능도 내부 통신이라고 할 수 있다.


아파치 웹서버의 파라메터나 도메인 정보가 바뀌었을때 데몬을 재 시작해도 상관없지만 보통의 경우는 killall -HUP httpd 이런식으로 해당 데몬에게 신호를 주는 방식도 있다.


내부 프로세서가 통신은 IPC라고 하는 칭하는데 3가지의 형태가 있다.

1. tcp, udp, pipe와 같이 데이타를 전송하는 방식

2. semaphore, mutex 와 같이 데이타 동기를 맞추는 방식

3. signal, wait 과 같이 신호를 전송하는 방식

더 많은 분류와 함수도 있겠지만 그 목적별로 나눈다면 위의 가지수가 될것이다.


이번에 설명하는 signal은 데모을 만들때 중요한 기능이므로 우선 설명하기로 한다.


예제 프로그램은 kill 호출이 되기전까지는 1초씩 기다리면서 무한루프를 도는 구조이다. SIGINT는 Ctrl+C를 막는 기능이고 SIGHUP은 일반적으로 프로그램에게 외부 환경 파일이 변경됨을 알려주는 기능으로 많이 사용한다. SIGTERM은 kill 신호를 받았을때 바로 죽지 않고 종료를 안전하게 처리하는 기능을 수행한다.


정확한 코딩방식으로는 signal로 받은 함수를 원상 복귀시키는 로직도 포함이 되어야 하지만 일반적으로 프로그램이 종료하면 자동 복귀가 되므로 생략하는 경우가 많다.


SIGCHILD는 fork로 생성된 프로세서가 종료될때 부모프로세서에게 종료됨을 알리고 부모가 wait도는 waitpid 형태의 함수를 호출해서 종료 상황을 인식할 수 있도록 프로그램을 짤 수 있다.


하지만 SIG_IGN 를 지정하면 해당 신호를 무시하여 간단히 처리하는것도 방법이다. 이렇게 처리하면 fork()로 생성된 child 가 종료시 defunct 형태로 ps 로 확인되는 zombi 프로세서의 생성을 자동적으로 처리해주는 기능을 수행하게 된다.


alarm 함수는 SIGALM을 호출하게 되어 타이머로서 이용할 수 있다.

block 모드로 동작하는 read, write, select 와 같은 함수에서 해당 기능을 이용하면 데이타 전송시 무한 대기로 빠지는 것을 방지할 수 있다.


단 kill -9 와 같이 강제 종료의 경우는 신호가 잡히지 않고 강제 종료가 되게 되므로 일반적인 kill 신호로 데몬을 종료시키면서 안전하게 종료하는 방법으로 개발해야 한다.


예제 프로그램을 실행하고나서 Ctrl+C 키를 누르거나 다른 텔넷창에서 kill -HUP process-id 과같이 테스트를 해볼 수 있다.

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <signal.h>  


int sig = 0;  


void sigRtn( int s )

{

    sig = s;

    printf( "Receive signal : %d", sig );

}  


void main()

{

    signal( SIGINT,  sigRtn );

    signal( SIGHUP,  sigRtn );

    signal( SIGTERM, sigRtn );

    signal( SIGALRM, sigRtn );

    signal( SIGCHILD, SIG_IGN );  


    alarm( 10 );  


    while( sig != SIGTERM )

    {

        sleep( 1 );

    }  


    printf( "Receive kill" );

}


3 장 : thread


많은 데몬 개발 또는 통신 프로그램에서 fork()를 많이 이용한다.

하지만 필자는 fork보다는 thread 를 더 선호하는 편이다.


fork()는 단순 클라이언트의 경우에 상당히 유리하고 간단하게 개발할 수 있는 반면에 클라이언트간에 데이타 공유나 전송에는 오히려 더 어려운 코딩을 해야 하기 때문이다.


fork()가 진정한 child프로세서를 만드는 기법이라면 thread는 윈도우의 개발 방식과 상당히 유사하기 때문에 윈도우 클라이언트와 연동하는 모델의 서버를 개발한다면 thread쪽을 더 권장한다.


thread 가 fork()와 가장 다른점은 함수단위의 스래드 처리가 가능하기 때문에 global 변수나 기타 다른 함수의 데이타 공유가 가능하다는 점이다. 하지만 이런한 편의성은 두 스래드간에 동시 자료 접근으로 인한 결함도 야기된다. 예를 들어 두 스래드가 동시에 트리 또는 큐같은 메모리를 사용하게 되면 데이타의 연결고리가 끝어질 수 있는 단접이 있다. 이런 경우에 이후에 설명할 예정인 세마포 또는 뮤택스와 같은 동기 함수를 이용하는 코딩 기법이 필요하게 된다.


이번 예제에서 가장 중요한 포인트는 cnt라고 하는 global변수가 fork()방식으로 했을때 parent와 child가 각각 다른 변수로 인식되는 반면 thread에서는 같은 변수로 사용이 되는 접을 알수 있는 소스다.


아래의 소스를 실행해보면 cnt가 중간에 바뀌고 나서 thread에서 출력시에도 바뀐 값을 똑같이 출력하는것을 확인 할 수 있다.


다중 타스크 프로그램에서 fork와 thread어느쪽이 정답이하고는 할수 없다.

그건 while 이냐 for 냐의 구분과 비슷할 것이다.

하지만 이 두 방식의 차이를 정확히 이해한다면 데몬 개발에서는 상당히 편리한 코딩을 할 수 있게 된다.


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <pthread.h>


int cnt = 0;


void *fun( void *arg )

{

printf( “This is child : %d“, getpid() );

sleep( 3 );

printf( “child end : %d“, cnt );


pthread_exit( NULL );

return 0;

}


void main( int argc, char *argv[] )

{

pthread_t t;

pthread_create( &t, NULL, fun, NULL );


cnt = 10;


printf( “This is parent : %d

“, getpid() );

sleep( 5 );

printf( “server end : %d

“, cnt );

}


=============================

This is child : 12325

This is parent : 12323

child end : 10

server end : 10



지난 3장까지는 기초적인 함수와 개녕이였고 이번 장부터는 실질 서버의 모습을 소개합니다.


첨부된 소스는 최소한의 코딩으로 만든 서버로 클라이언트가 접속한뒤 문자열을 송신하면 클라이어트에 받은 문자갯수를 돌려주고 종료하는 프로그램입니다.


테스트를 위해서는 telnet 을 클라이언트로 이용하시면 됩니다.

서버 기동시 포트번호를 파라메터로 입력하시면 되는데 주의할점은 1024 이하의 번호를 쓰기 위해서는 root로 로그인되어야 하고 이후번호의 경우는 무관합니다. linux의 기본 보안 정책이고..


tcp 서버를 만들기 위해서 가장 기본적으로 사용하는 함수는

socket, bind, listen, accept, recv, send, close


클라이언트라면

socket, connect, send, recv, close


서버의 경우는 bind, listen, accept 가 추가됩니다.


socket은 통신을 하기 위한 핸들을 생성하는 함수입니다.

파일 오픈과 동일한 기능이라고 생각하면 됩니다.

실재로 socket에서 리턴된 핸들에다 read, write와 같은 파일 명령으로 데이타를 송수신하여도 동일한 결과로 동작하게 됩니다.

close를 이용하는 걸 봐도 같다는걸 알수 있습니다.


bind는 뭔가를 묶는다는 뜻이므로 해당 어드레스와 포트를 시스템에게 예약하는 명령어입니다.


listen은 클라이언트가 젒속하도록 대기상태로 만드는 것입니다.

실제로 listen 이후부터는 클라이언트가 접속이 가능합니다.


일반적으로 listen( s, 5 )라고 5라는 숫자가 있는 리눅스의 기본 queue의 갯수가 5입니다. 변경할 필요도 없으면 크게 한다고 해서 실제로 커지지도 않습니다. 큐의 개념은 accept 로 빼내기전에 버퍼링되는 커넥션이라고 생각하면 됩니다.


accept라는것을 접속대기중인 클라이언트를 실제로 프로그램과 접속을 시켜주는 명령어입니다. accept의 리턴값이 소켓이고 새로운 소켓번호를 통해서 접속된 클라이언트와 송수신을 하게 되는 것입니다.


이후는 recv, read, send, write의 함수를 이용해서 통신을 하면됩니다.


샘플소스는 무조건 클라이언트를 기다라다가 접속이후 문자열을 기다리다가 문자열이 들어오면 문자열을 출력한뒤 클라이언트로 해당 문자열의 길이를 반환하고 종료하는 프로그랭입니다.


실제로 서버라기 보다는 수신 대기프로그램 및 수신 테스트 프로그램이라고 생각하면 됩니다.


#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>  


#include <netdb.h>

#include <sys/socket.h>

#include <arpa/inet.h>  


int main( int argc, char *argv[] )

{

    if ( argc != 2 )

    {

        printf( "Usage : %s port", argv[0] );

        return -1;

    }  


    struct sockaddr_in  addr;  


    memset( &addr, 0, sizeof(addr) );  


    addr.sin_addr.s_addr = htonl( INADDR_ANY );

    addr.sin_port = htons( atoi( argv[1] ) );  


    int s = socket( AF_INET, SOCK_STREAM, 0 );  


    if ( !bind( s, (struct sockaddr *)&addr, sizeof(struct sockaddr_in) ) )

    {

        if ( !listen( s, 5 ) )

        {

            int S = accept( s, NULL, NULL );  


            if ( S != -1 )

            {

                char buff[1024];

                int  size;  


                memset( buff, 0, sizeof(buff) );

                size = read( S, buff, sizeof(buff) );  


                printf( "Read : %s", buff );  


                sprintf( buff, "Read %d bytes", size );

                write( S, buff, strlen(buff) );  


                close( S );

                printf( "Disconnect" );

            }

            else

            {

                printf( "accept error" );

            }

        }

        else

        {

            printf( "listen error" );

        }

    }

    else

    {

        printf( "bind error" );

    }  


    close( s );  


    return 0;

}





2008. 7. 18. 05:00


Java Simple Daemon

http://kldp.net/projects/jsd/

뭐에 쓰는 물건인고?
Java Simple Daemon은 자바를 이용해서 데몬 프로그램을 작성하도록 도와주는 프레임워크이다(비록 프레임워크라고 부르기엔 너무도 작지만.. ^^).
가끔씩 특정 디렉토리에 들어오는 파일을 감시해서 파일이 들어오면 그 파일을 DB에 넣기만 하거나, 혹은 어떤 방식으로든 메시지를 받아서 받은 메시지를 가공해 다른 쪽에 메시지로 넘겨 주거나 하는 등의 역할을 하는 그런 프로그램을 자바로 짤 경우가 있다.
이러한 프로그램들은 일반적으로 그래픽 사용자 인터페이스(GUI)나 화면 출력이 필요 없이 파일로 로그만 남기고 자기 할 작업을 한다. 이러한 프로그램을 데몬(Daemon)이라 부른다.
자바로 이러한 데몬을 작성할 경우, 데몬을 실행시키는 것은 문제가 없다.


$ nohup java some.Daemon &
이러한 식으로 실행하면 된다. 헌데 문제는 종료이다. 프로그램과 의사 소통할 무슨 방법이 없기 때문에 Unix에서 ps -ef명령으로 "java" 프로세스를 찾아서 kill명령을 내리거나 윈도우의 경우에는 프로세스 종료를 시킬 수 밖에 없다. 이러한 문제를 해결하기 위해 만든 것이 Java Simple Daemon(이하 JSD)이다.

프로젝트 홈

프로젝트 개발 홈
사용자/개발자 게시판

다운로드
Java Simple Daemon 다운로드 목록
어찌 작동하는고?
원리는 단순하다. 데몬 역할을 하는 자바 클래스를 실행시켜주면서 쓰레드가 하나 떠서 사용자의 홈 디렉토리(Unix에서 $HOME 환경변수가 가리키는 디렉토리)에 특별한 파일이 존재하는지를 검사한다. 만약 그 특별한 파일이 존재한다면 JVM을 자동으로 종료시켜준다. JSD는 그 특별한 파일이 있는지 검사하는 역할과, 그 파일을 생성 시켜주는 역할을 한다.


덤으로, JSD는 데몬 클래스에 따라 락(Lock) 파일도 생성해준다. 홈 디렉토리에 락 파일이 존재할 경우, 데몬을 다시 띄우려고 하면 데몬 띄우기를 거부한다.

사용하기

데몬 클래스는 net.kldp.jsd.SimpleDaemon 인터페이스를 구현해야 한다.
public void startDaemon() : 데몬작업을 수행하는 메소드. 여기에 실제 작업 구현이 들어간다.
public void shutdown() : 데몬이 종료하기 전에 수행할 작업을 기록한다.
net.kldp.jsd.SimpleDaemonManager의 객체를 생성하고, 객체에 데몬 클래스를 등록해 준다.
net.kldp.jsd.SimpleDaemonManager.start()를 실행하면 데몬이 시작된다.
net.kldp.jsd.SimpleDaemonManager.shutdownDaemon()를 실행하면 데몬을 종료시키는 파일이 $HOME 디렉토리에 생성되어, 데몬을 종료시키게 된다.

예제 보기
아래 예제는 대책없이 화면에 시간을 출력하는 데몬이다.


데몬의 시작 : java net.kldp.jsd.sample.ShowTime
데몬의 종료(다른 콘솔 창에서) : java net.kldp.jsd.sample.ShowTime -shutdown
여기서 데몬을 종료하기 전에 다시 한번 데몬을 시작해보면 락 파일이 존재하기 때문에 실행을 거부하는 것을 볼 수 있다.
/*
 * Created on 2004. 11. 6.

 */
package net.kldp.jsd.sample;

import java.io.IOException;
import java.util.Date;

import net.kldp.jsd.IllegalSimpleDaemonClassException;
import net.kldp.jsd.SimpleDaemon;
import net.kldp.jsd.SimpleDaemonManager;

/**
 * SampleDaemon 예제.
 *
 * 현재 시간을 계속해서 보여주는 데몬이다.
 *
 */
public class ShowTime implements SimpleDaemon {

  public static void main(String args[]) {
    // -shutdown 옵션이 있을 경우 데몬을 종료시킨다.
    if (args.length > 0 && args[0].equals("-shutdown")) {
      System.out.println("ShowTime 종료시작.");
     
      try {

        SimpleDaemonManager sdm = SimpleDaemonManager.getInstance(ShowTime.class);
        sdm.shutdownDaemon();
      } catch (IOException e1) {
        e1.printStackTrace();
      } catch (IllegalSimpleDaemonClassException e) {
        e.printStackTrace();
      }
      return; // 프로그램 종료.
    }

    SimpleDaemonManager sdm = null;
   
    try {
      sdm = SimpleDaemonManager.getInstance(ShowTime.class);
      sdm.start();
    }  catch (Exception e) {
      e.printStackTrace();
    }
  }
 
  /**
   * 데몬 작업수행 : 현재 시간을 계속 보여준다.
   */
  public void startDaemon() {
    while (true) {
      Date now = new Date();
      System.out.println(now.toString());
      try {
        Thread.sleep(5000);
      } catch (Exception ex) {
        ex.printStackTrace();
      }
    }
   
  }

  /**
   * ShowTime 종료시 실행할 내용들.
   */
  public void shutdown() {
    System.out.println("ShowTime을 종료합니다.");
  }
}

2008. 7. 13. 05:00
실수로 바이너리 파일을 cat 하거나 하여 글자들이 깨질때.. 터미널 리셋하는 방법
tput sgr0
setterm -reset
setterm -initialize
reset
Ctrl + V, Ctrl + O


이것들 중 아무거나 ㅋㅋ
2008. 7. 9. 05:00



1. RConnectClient.exe라는 프로그램을 사용해서 하는 방법
http://rconnect.hanfolder.com/about.html 에서 파일 다운 받아서 사용하면 된다.
사용법은 해당 사이트에 있다.

2. proxy sever를 직접 찾아서 입력하는 방법
http://www.bestproxylists.com/index.html 에서 proxy server 종류를 따라 해당 사이트에 가서
proxy server list를 보고 각 메신저에 proxy server등록하는 방법이다.
방법은 메신저마다 조금씩 다르다.

3. HTTP-Tunnel 사용하는 방법
http://www.http-tunnel.com/html/에서 파일을 다운 받아서 사용하면 된다.
파일 다운 받은 후 설치하고 실행한다.


configure에서 test를 하면 접속되었다는 식의 alert 메세지가 뜬다.


그리고 창에 해당 포트가 뜬다. 위 이미지는 한참 실행하는 중간 캡쳐 화면이라 접속 포트가 없다.(내 경우 1801포트다)
아래는 네이트온 설정화면이다.


이런 방법으로 우회가 가능하나, free의 경우 가끔 메세지가 씹히는(?) 문제가 있다.ㅡ,.ㅡ

2008. 7. 8. 05:00
UTF-8 과 UINCODE 상호 변환


출처 : 국민대 컴퓨터공학부
http://nlp.kookmin.ac.kr
2008. 7. 8. 05:00

 

STL C++ 사용자 가이드
Rogue Wave STL C++ User Guide
http://ws1.kist.re.kr/doc/pgC++_lib/stdlibug/ug1.htm

한글판
http://idb.snu.ac.kr/~sjjung/stl/booktoc1.htm

http://www.omnistaronline.com/~fonin/projects/gnuitar/docs/install.html
http://www.gimp.org/windows/

http://www.gtk.org/download-windows.html


Windows Build Notes
To build GNUitar on Windows, you will need the following:

Microsoft Visual C++ 6.0 compiler (MSVC);
GTK 1.2 for Windows
Glib 1.2 for Windows
GNU libintl for Windows
GNU libiconv for Windows
All the software except MSVC is free and can be downloaded from the site http://www.gimp.org/win32
OR
http://www.gimp.org/~tml/gimp/win32


Currently, the exact links are:
http://www.gimp.org/~tml/gimp/win32/libintl-0.10.40-tml-20020904.zip
http://sourceforge.net/project/showfiles.php?group_id=25167 (general link for libiconv)
http://prdownloads.sourceforge.net/gettext/libiconv-1.8-w32-1.bin.zip?download
http://www.gimp.org/~tml/gimp/win32/glib-2.4.7.zip
http://www.gimp.org/~tml/gimp/win32/glib-dev-2.4.7.zip
http://www.gimp.org/~tml/gimp/win32/gtk+-1.3.0-20040315.zip
http://www.gimp.org/~tml/gimp/win32/gtk+-dev-1.3.0-20030115.zip
Please note that these links may change with the software updates. Another important note that since the first edition of this build guide, the original packages for GLib 2.2 and GTK 1.3 were removed. What I found are somewhat different versions, however I believe they should work. There is a certain doubt about compatibility of GLib 2.4 and libintl 0.10. In the case of any problems you should download all the latest packages for GLib and its dependencies (but NOT GTK 2.6 !)

You need to prepare your build environment, before you start to compile. Most of the packages above contain 2 important directories: "lib" and "include". Copy the contents of the "lib" directory of each package to the folder C:\Program Files\Microsoft Visual Studio\VC98\Lib (adjust this path to the real path where your MSVC installed), and the contents of the "include" directory to C:\Program Files\Microsoft Visual Studio\VC98\Include. Rename include\glib-2.0 to include\glib, lib\glib-2.0 to lib\glib, move \lib\include\gtk+\gdkconfig.h to include\gtkconfig.h. Now, you are ready to build the program. Launch MS Visual Studio, choose File->Open, select file gnuitar.dsp.
Select Build->Set Active Configuration and choose "Release" for Pentium Pro/II/III, or "Release 586" for Pentium processor, to make the benefit of Pentium CPU extended instructions set.
Press F7 to start build. If all the above were done correctly, you should not get error messages (please note that it produces few dozens of warnings, it is ok). If you get something like "Linker error: cannot resolve external symbols ...", this means that you've done something wrong when preparing build environment.


Command-line users should first run the file C:\Program Files\Microsoft Visual Studio\VC98\Bin\vcvars32.bat, to set environment variables, and then run:

nmake /f gnuitar.mak

If all went fine, you should pickup the file gnuitar.exe in the folder gnuitar\Release\ or gnuitar\Release 586\ depending on which configuration did you chose. Now, copy the gnuitar executable somewhere where you are going to keep it, and copy the files:

iconv.dll
libgdk-0.dll
libglib-2.0-0.dll
libgmodule-2.0-0.dll
libgtk-0.dll
libintl-1.dll

to the same folder as gnuitar.exe. Ready.
Windows Installation - Binary Package
GNUitar binary package does not require specific install on Windows - just unzip the package and run gnuitar.exe.

Linux - Install From RPM
RPM stands for RedHat Package Manager. Just download rpm file from the GNUitar site, and issue shell command as root:


rpm -i gnuitar-x.y.z.i386.rpm

Linux - Create Your RPM
You can create your own rpm package on Linux. To do so, you need first to install the package "rpm-build" from your Linux CD (first check does the /usr/src/redhat/ directory exist, if yes then you already have it installed). Then, copy the file gnuitar.spec to /usr/src/redhat/SPECS, and gnuitar-x.y.z.tar.gz to /usr/src/redhat/SOURCES. Changde dir to /usr/src/redhat/specs and issue


rpm -bb gnuitar.spec

2008. 7. 4. 05:00
PC와 휴대폰을 데이터케이블로 연결한 후
1단계 : 전화 및 모뎀 옵션 설정
1. "제어판"을 누른 후 "전화 및 모뎀옵션"을 선택
2. "새로만들기" 선택
3. 위치이름을 예를들면 "아무거나"로
국가/지역 "대한민국"
지역번호 "1501"
사용방식 "톤" 을 지정하고 "적용" "확인"
4. 모뎀 Curitel Packet Service이 뜨는것을 볼 수 있다.
"속성"탭을 누른다.
5. "등록정보"가 나온다.
6. "고급탭"으로 가서 "기타설정"에 "기타초기화 명령"에 다음과 같이 입력
영어 소문자로 "at+crm=150" 입력하고 "확인"
이전의 "전화 및 모뎀옵션" 창으로 복귀한다. 여기에서 "적용" "확인"

2단계 : 네트워크 연결 설정
1. 제어판의 "네트워크연결" 선택
2. 왼쪽창의 "새연결만들기" 선택
3. "새연결마법사"창이 나온다. "다음"
4. "인터넷에 연결" 지정하고 "다음"
5. "연결을 수동으로 설정(M)" 지정하고 "다음"
6. "전화 접속 모뎀을 사용하여 연결(D)" 지정하고 "다음"
7. 연결이름 "ISP 이름(A)"에 예를들어 "연습"이라고 지정하고 "다음"
8. 전화 걸 번호 "1501" 지정하고 "다음"
9. 인터넷 계정 정보의
"사용자이름"에 영어 소문자로 "sktelecom" 이라고 입력하고
"암호" 공란
"암호확인" 공란으로 비워둔다.
체크박스 3가지 중
위의 두개는 체크해두고
마지막 3번째 방화벽은 사용하지 않기로 한다.
"다음"을 클릭
10. 새연결마법사가 완료된다.
편의상 "바탕화면에 이 연결의 바로 가기 만들기"에 체크한후 "마침"을 누른다.
11. 아까 설정해두었던 연습이란 이름으로 연결하느냐는 창이 뜬다.
전화걸기 버튼을 누른다.
2008. 5. 28. 05:00

1. 다운로드 : 인코더패키지 (설치 안해도 무관)
http://mysecu.net/tt/31
http://www.mysecu.net/update/epackv500beta.exe

2. 다운로드 : badak
http://www.kipple.pe.kr/doc/badak/
http://www.kipple.pe.kr/doc/badak/badak20080526.exe
badak20080526.exe

3. 다운로드 : mencoder-codecpack
http://www.kipple.pe.kr/doc/badak/mencoder-codecpack-20061022.exe
mencoder-codecpack-20061022.exe

4. 설치 : badak
badak20080526.exe

5. 설치 : mencoder-codecpack
mencoder-codecpack-20061022.exe

6. 설정:

7. 기타 정보
설치파일
- badak20080526.exe(5441KB) : mencoder + 바닥
- mencoder-codecpack-20061022.exe(6680KB) : mencoder 용 코덱모음. 바닥 설치후 설치한다.
   rm/wmv9/mov 와 같은 기본적으로 지원하지 못하는 파일을 인코딩할때 필요하다.
   대부분의 경우 이건 설치 안해도 되며, 설치해도 시스템을 전혀 건드리지 않는다.

바닥은 MENCODER 의 프론트엔드로, 여러가지 동영상 파일을 간편하게 AVI 파일로 바꿔주는 프로그램이다.


사용 용도
PC용 동영상을 PDA 에서 재생하고자 할때
고화질 동영상을 작은 크기의 저화질 동영상으로 변환하고 싶을때
SMI 자막을 동영상에 입히고 싶을때 사용
인덱스가 손상된 AVI 파일의 인덱스 복구용
PMP 나 DIVX 플레이어에서 지원 못하는 포맷을 지원 가능한 포맷으로 변환하고자 할때
WMV 나 ASF 로 인코딩된 교육/강좌 동영상을 AVI 파일로 바꾸고자 할때
MOV 나 RM 파일을 AVI 로 변환하고자 할때 ( 아래 코덱모음 설치 필요 )

2008. 5. 28. 05:00

OGG 를 MP3로 변환

1. 다운로드 : BeSweet v1.4
http://dspguru.doom9.org/
http://besweet.notrace.dk/BeSweetv1.4.zip
2008.05.28 현재 최신 안정화 버전은 BeSweet v1.4 이다.

2. 다운로드 : BeLight-0.22
http://coreforge.org/projects/belight
http://coreforge.org/frs/download.php/7/BeLight-0.22_RC1.zip
2008.05.28 현재 최신 베타 버전은 BeLight-0.22 이다

3. 압축 해제 : BeSweet v1.4
C:\Program Files\BeSweet

사용자 삽입 이미지

4. 압축 해제 : BeLight-0.21
C:\down\BeLight-0.21

사용자 삽입 이미지

5. 복사 : BeLight-0.21
C:\down\BeLight-0.21 통째로 C:\Program Files\BeSweet 로 옮긴다.

사용자 삽입 이미지

6. 바탕화면에 바로가기 만들기
BeLight.exe 파일에 우클릭하고 "보내기 -> 바탕화면에 바로가기 만들기"를 클릭한다.

7. 실행 : BeLight
BeLight를 실행한다.

사용자 삽입 이미지