음 이것에 관련해서는 온라인서버제작모임에 명예의전당에 올라온 "Ciritical Section을 이용한 동기화 처리법"
을 보고 좀 고민하다가 리플에 GPG에 관련 또 글이 있어서 그거보고 제가 초금 개조 해봤습니다..

GPG에서 참고 한 글 링크 : http://www.gpgstudy.com/forum/viewtopic.php?t=10593
코딩할때 참고 한 글 링크 : http://ricanet.com/new/view.php?id=blog/050807
                                     http://ricanet.com/new/view.php?id=blog/050811a

class는 CCriticalSection 과 CSynchronized 2가지를 이용합니다.
 class CCriticalSection
{
private:
    CRITICAL_SECTION m_cs;

public:
    CCriticalSection(void)
    {
        ::InitializeCriticalSection( &m_cs );
    }
   
    virtual ~CCriticalSection(void)
    {
        ::DeleteCriticalSection( &m_cs );
    }

    void Lock(void)
    {
        ::EnterCriticalSection( &m_cs );
    }

    void Unlock(void)
    {
        ::LeaveCriticalSection( &m_cs );
    }
};

 class CSynchronized
{
private:
    CCriticalSection* m_pLock;

public:
    CSynchronized(CCriticalSection* _pLock) : m_pLock(_pLock)
    {
        m_pLock->Lock();
    }

    virtual ~CSynchronized(void)
    {
        m_pLock->Unlock();
    }

    operator bool()
    {
        return false;
    }
};

그리고 좀 깔끔하게 쓰기 위해서 define을 사용 하는데 아래와 같습니다.
 #define SYNCHRONIZED_BLOCK(CSif(CSynchronized _lock = CS) {} else   

자 이것에 대한 설명을 하자면
CriticalSection을 사용하다보면 EnterCriticalSection()걸고 LeaveCriticalSection()를 실행하지 않아 데드락에 빠지는
상황이 발생 할수 있습니다. 그것을 코드적으로 방지 하기 위해 생성자와 소멸자를 이용해서 만든것이 CCriticalSection 과 CSynchronized 입니다.


일단 간단하게 사용 방법을 설명하자면 아래와 같이 class에 CriticalSection을 상속 받습니다.
 class CTest :public CCriticalSection
{
public:
    CTest(void);
    ~CTest(void);

    char temp[128];
};

CriticalSection을 이용 할때는 아래와 같이 사용합니다.

CTest
test;                                                          // 변수 선언

{
     CSynchronized sync( &test );                           // EnterCriticalSection 실행

     sprintf( test.temp, "테스트 아햏햏");                   //  작업
     printf("%s\n", test.temp);
}                                                                       // LevelCriticalSection 실행


하지만 위와 같은 방식은 코드를 보기에 뭔가 좀 직관적이지 않아서 (직관적이지 않다는것은 중괄호 안에 Lock를 사용한다고
선언하는것을 말함) Define을 사용해서 요것을 좀 바꿔본것입니다.
 
CTest
test;                                                          // 변수 선언

SYNCHRONIZED_BLOCK( &test )                          // EnterCriticalSection 실행
{
     sprintf( test.temp, "테스트 아햏햏");                   //  작업
     printf("%s\n", test.temp);
}                                                                       // LevelCriticalSection 실행


by 널부러 2009. 3. 11. 18:03
에 오늘 아는 횽님이 http로 파일 다운로드 하는 모듈 함 만들어 봐라 해서
집에와서 씻고 한 3시간 만에 대충 어떻게 만들어야 하는지 알아낸거 같다 -_-
그래서 정리 해본다.

일다 사용한것은 wininet 함수를 사용하였다.
대략 함수의 중요 요점만 정리 해보겠다.

1. InternetOpen() 함수
   웹서버에 접속하기 위해 최초로 만드는 핸들이다. 이건 뭐 특별할꺼 없으니 패스

2. InternetOpenUrl() 함수
   url 경로를 입력해주면 url에 걸려있는 파일을 바로 열수 있는 함수다 이놈은 초금 중요하다
   보통 3,4 인자값은 NULL, 0 값을 주는데 이놈에게 값을 주면 이어 받기가 가능하다.
   주는 방법은 소스를 정리해서 나중에 주석으로 설명해주겠다.

3. InternetQueryDataAvailable() 함수
   위대한 win32api 정복에는 다음과 같이 설명되어있다.
   요청된 파일의 몇 바이트나 전송할 준비가 되었는지를 두번째 인자에 리턴 해준다 라고
   뭐 웹서버에서 보낸 패킷의 크기가 얼마나 되는지 알려주는거 같다.

4. InternetReadFile() 함수
   요함수는 따로 책에는 설명이 없는데 웹서버가 보낸 패킷을 받는 부분 같다
   뭐 정확하게는 모르겠지만..

5. HttpQueryInfo() 함수
    음 이건 InternetOpenUrl()가 리턴한 인스턴스 핸들 가지고 이용하면 되는건데
    파일의 크기를 알아낼수 있는 함수 인거 같다 다른 기능도 있는거 같은데
    파일 크기는 이걸로 알아낼수 있는거 같다.

일단 필요했던 http 다운로드 기능은 요 5가지 함수를 이용하면 금방 만들꺼 같다
뭐 거기에 더 필요한건 파일 쓰기 정도 -_-
아까 이어 받기 테스트 하는데 가끔 파일을 이상하게 받을때가 있던거 같은데
수작업으로 해서 그렇수도 있으니까
뭐 클래스로 만드는건 천천히 하면 될꺼 같다...

아무튼 한번도 안해봐서 못할줄 알았는데 역시 책보고 데브피아 찾아보고 하면 안되는건 없다...
다음에 올리면 클래스로 만든 소스를 함 올려보도록 하겠다 언제가 될진 나도 잘 모르지만..


by 널부러 2009. 2. 4. 01:26
출처 : http://unix.co.kr/

1. vi의 시작

명령어

작업 설명

vi filename

파일 열기, 작성

vi +18 filename

18행으로 파일 열기

vi +/"string" fn

"string"의 처음발생 단어부터 열기

vi -r filename

손상된 파일 회복

view filename

읽기 전용으로 파일 열기


2. 커서의 이동 명령

명 령 어

작 업 설 명

h(←)
j(↓)
k(↑)
l(→)

왼쪽으로 커서 이동
아래로 커서 이동
위로 커서 이동
오른쪽으로 커서 이동

w
b

한 단어 오른쪽으로 커서 이동
한 단어 왼쪽으로 커서 이동

^
$

라인의 처음으로 이동
라인의 마지막으로 이동

H
M
L

화면의 맨 위로 이동
화면의 중간으로 이동
화면의 맨 아래로 이동

Ctrl+F
Ctrl+D
Ctrl+B
Ctrl+U

한 화면 뒤로 이동
반 화면 뒤로 이동
한 화면 앞으로 이동
반 화면 앞으로 이동


3. 문자와 행삽입

명 령 어

작 업 설 명

a

커서 오른쪽에 문자 삽입

A

커서 오른쪽, 행의 끝에 문자 삽입

i

커서 왼쪽에 문자 삽입

I

커서 왼쪽, 해의 처음에 문자 삽입

o

커서 아래에 행 삽입

O

커서 위에 행 삽입

<ESC>

작업 종료후 <ESC> 입력


4. 텍스트 변경

명 령 어

작 업 설 명

cw (종료 :ESC)

단어 변경

R (종료 :ESC)

현재 커서 위치부터 대체

r

커서 위치 문자를 다른 문자로 대체

~

문자형(대, 소문자)변경

J

현재 행과 아래 행 결합

u

이전 명령 취소


5. 텍스트 삭제

명령어

작 업 설 명

x

문자 삭제

dw

단어 삭제

dd

행 삭제

D

커서 오른쪽 행 삭제

;5, 10 d

5-10번째 삭제


6. 텍스트 복사 및 이동

명 령 어

작 업 설 명

yy

행 yank

Y

행 yank

p

yank되거나 삭제된 행 현재 행 아래에 삽입

P

yank되거나 삭제된 행 현재 행 위에 삽입

:1,2 co 3

1-2행을 3행 다음으로 복사

:4,5 m 6

4-5행을 6행 다음으로 이동


7. 행 번호 설정

명 령 어

작 업 설 명

:set nu

행 번호 표시

:set nonu

행 번호 숨기기


8. 행 찾기

명 령 어

작 업 설 명

G

파일의 마지막 행으로 가기

21G

파일의 21번째 행으로 가기

:n

n 라인으로 가기


9. 탐색 및 대체

명 령 어

> 작 업 설 명

/string

> string 탐색

?string?

> string 역방향 탐색

n

> string의 다음(이전) 계속 탐색

:g/search-string/s//

replace-string/gc

각 발생 탐색 후 확인하고 대체

:s/str/rep/

> 현재 행의 str을 rep로 대체

:1,.s/str/rep/

> 1부터 현재 행의 str을 rep로 대체

:%s/str/rep/g

> 파일 전체 str을 rep로 전부 대체

10. 파일을 파일로 삽입

명령어

> 작 업 설 명

:r filename

> 커서 다음에 파일 삽입

:34 r filename

> 파일을 34번째 행 다음에 삽입

 


by 널부러 2008. 10. 22. 14:04