(Draw, Paint 사용가능)

 

HANDLE bmp;

CBitmap cBitmap;

BITMAP bmpinfo;

//CDC는 pDC

CDC memdc;

bmp = LoadImage(NULL, _T("DDR_Skin/button/bt_Loop.bmp"), IMAGE_BITMAP, 0,0, LR_LOADFROMFILE);

cBitmap.Attach(bmp);

cBitmap.GetBitmap(&bmpinfo);

memdc.CreateCompatibleDC(pDC);

memdc.SelectObject(bmp);

//pDC->BitBlt(chkboxrect.left,chkboxrect.top,bmpinfo.bmWidth,bmpinfo.bmHeight, &memdc, 0,0,SRCCOPY);

pDC->TransparentBlt(chkboxrect.left, chkboxrect.top, bmpinfo.bmWidth, bmpinfo.bmHeight, &memdc, 0, 0, bmpinfo.bmWidth, bmpinfo.bmHeight, RGB(0,0,0));

 

 

 

memdc.DeleteDC();

cBitmap.DeleteObject();

함수

((CDDR3Dlg*)GetParent())->AdditemDrag(Itemcnt,AddDragPath);

 

변수

((CDDR3Dlg*)GetParent())->m_cnt = 1;

 

#include <TlHelp32.h>

 

BOOL Cex_ProcessKDlg::KillProcess(CString strName)

{

strName.MakeUpper();

HANDLE hSnapshot = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 );

if ( (int)hSnapshot != -1 )

{

PROCESSENTRY32 pe32 ;

pe32.dwSize=sizeof(PROCESSENTRY32);

BOOL bContinue ;

CString strProcessName;

if ( Process32First ( hSnapshot, &pe32 ) )

{

do

{

strProcessName = pe32.szExeFile; //strProcessName이 프로세스 이름;

strProcessName = strProcessName.MakeUpper();

if( ( strProcessName.Find(strName,0) != -1 ) )

{                                        

HANDLE hProcess = OpenProcess( PROCESS_TERMINATE , FALSE, pe32.th32ProcessID );

if( hProcess )

{

DWORD dwExitCode;

GetExitCodeProcess( hProcess, &dwExitCode);

TerminateProcess( hProcess, dwExitCode);

CloseHandle(hProcess);

CloseHandle( hSnapshot );

return TRUE;

}

return FALSE;

}

bContinue = Process32Next ( hSnapshot, &pe32 );

} while ( bContinue );

}

CloseHandle( hSnapshot );

}

 

return FALSE;

}


[스크랩]

'Computer Science > Languages' 카테고리의 다른 글

[MFC] BMP 비트맵 투명 그리기  (0) 2015.02.23
[MFC] 부모 다이얼로그 함수 변수 호출  (0) 2014.11.18
[MFC] force shutdown process  (0) 2014.04.06
[C/C++] 주민등록번호 규칙  (0) 2010.12.31
Dev-C++ 4.9.9.2 , C/C++ Compiler  (0) 2010.12.01
요일구하는 공식  (0) 2010.11.28

 

 

1. (Hashing)이란 무엇인가?

 

 

- 해싱(hashing)이란 한마디로 말해서 많은 양의 데이터(data)들을 그보다는 작은 크기의 테이블(table)로 대응

(mapping)시켜 저장할 수 있도록 하는 일종의 데이터 관리 기법이다. 데이터들을 저장하거나 찾을 때 인덱스

(index)라는 또다른 데이터 스트럭쳐(data structure)를 이용하는 대신, 각 데이터들이 테이블의 어느 영역에 위

치할 것인가를 결정해주는 해쉬함수(hash function)를 사용하여 일정한 시간 내에 데이터들을 효과적으로 찾을

수 있도록 해주는 것이 바로 해싱이다. 따라서 데이터들은 순차적으로 저장되는 것이 아니라 테이블 전 영역에

걸쳐서 고루 분포하게 되며, 저장된 데이터를 찾을 때에도 해쉬함수를 사용하면 곧바로 그 위치를 알 수가 있

기 때문에 빠르게 데이터를 검색할 수가 있게 된다.

그러나 해싱은 그 기본 개념으로 인하여 매우 치명적인 약점을 지니고 있는데, 해쉬함수가 이상적(ideal)이지

않은 이상 서로 다른 키(key)들이 테이블의 같은 위치로 결정될 소지가 다분하다는 것이 바로 그것이다. 이런

현상을 충돌(collision)이라 하며, 따라서 해싱에서는 이 충돌을 어떻게 해결할 것인가가 매우 커다란 이슈

(issue)가 된다. 결국 해싱 알고리즘(hashing algorithm)은 해쉬함수와 충돌해결전략(collision resolution

strategy)으로 나뉘게 된다.

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

 

 

 

2. Hashing Algorithm

 

- 해싱 알고리즘(hashing algorithm)은 해싱을 위한 구현 부분으로, 다음과 같이 크게 세 가지로 구분할 수가 있다.

2.1. 완전 해싱 (Perfect Hashing)

- 완전 해싱은 나중에 좋은 해싱 기법으로 언급될 simple uniform 해싱을 의미한다. 즉 서로 다른 키(key)값이 해싱에 의해 주소값을 할당받을 때, 주소값이 절대로 겹치지 않는 이상적인 해싱을 의미한다. 물론 이런 방식은 일대일대응 이외에는 존재하지 않는 방식으로 이상적인 것이다.

2.2. 정형 해싱 (Conventional Hashing)

- 데이타 개수를 이미 알고 있어서, 데이타들이 저장될 주소 범위를 미리 데이타 개수만큼 지정해 두는 방식을 의미한다. 즉, 필요한 메모리의 크기는 미리 측정되고 미리 할당받아야 한다.

2.3. 동적 해싱 (Dynamic Hashing)

- 정형 해싱의 문제점은 데이타를 입력하기 이전에 데이타 개수에 대한 정보가 있어서 메모리를 미리 할당받아야 한다는 점이다. 일반적으로 시간이 지남에 따라서 데이터의 양의 증가하게 되므로 잘못된 측정으로 데이터가 메모리의 범위를 넘게 되면, 더 큰 메모리 크기를 잡고 다시 해싱을 해야 하는 시간적, 자원적 낭비가 일어나게 된다. 동적 해싱은 이러한 데이터의 증감에 적응하기 위해서 나타난 것으로, 동적으로 메모리의 크기를 변화시키는 해싱 기법을 의미한다.

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

 

 

3. Hash Function

 

- 해싱 알고리즘을 해쉬 함수라고 부른다. 해싱 함수(hashing function) h(k)는 어떤 키 k에 대한 테이블 주소(table address)를 계산하기 위한 방법으로, 주어진 키 값으로부터 레코드가 저장되어 있는 주소를 산출해 낼 수 있는 수식을 말한다.

해싱은 빠른 속도의 데이터 검색 외에도, 전자서명을 암호화하고 복호화 하는 데에도 사용된다. 전자서명은 해쉬 함수를 이용하여 변환된 다음, 해쉬 값(이를 요약 메시지라고 부른다)과 전자서명이 별도로 전송된다. 수신자는 송신자가 사용한 해쉬함수와 같은 것을 사용하여, 서명으로부터 요약 메시지를 뽑아내어 그것을 이미 수신한 요약 메시지와 비교한다. 그 비교 결과는 같아야만 전자서명이 유효한 것이다.

해쉬 함수는 원래의 값이나 키를 색인하는데 사용되며, 그값이 관련된 데이터가 검색될 때마다 다시 사용된다. 그러나, 해싱은 항상 한 쪽 방향으로만 연산된다. 따라서, 해쉬된 값을 분석함으로써 해쉬 함수를 추출해내는 역방향 공학은 필요가 없다. 사실, 이상적인 해쉬함수는 그러한 분석에 의해 추론할 수 없어야 한다. 또한, 우수한 해쉬 함수는 서로 다른 두 개의 입력에 대해, 동일한 해쉬 값을 생산해서는 안된다. 만약 그렇게 되면, 충돌이 생긴다. 충돌 위험성이 매우 적은 해쉬 함수라야 훌륭한 해쉬 함수로 평가된다.

데이터베이스 저장이나 검색에 잘 적용되는 해쉬 함수는 오히려 암호화나 에러검출 목적으로는 잘 듣지 않을 수도 있다. 암호화에 사용되는 잘 알려진 해쉬 함수들이 몇 개 있다. 이러한 것들에는 전자서명을 요약 메시지라고 불리는 더 짧은 값으로 바꾸는 데 사용되는 요약 메시지 해쉬 함수 MD2, MD4, MD5 등과, 더 큰 요약 메시지 (60 비트)를 만드는 표준 알고리즘인SHA (Secure Hash Algorithm) 등이 포함된다.

 

 

'Computer Science > Algorithm' 카테고리의 다른 글

Hashing 이란?  (0) 2012.04.09
알고리즘 강좌 7회  (0) 2010.11.28
알고리즘 강좌 6회  (0) 2010.11.28
알고리즘 강좌 5회  (1) 2010.11.27
알고리즘 강좌 4회  (0) 2010.11.27
알고리즘 강좌 3회  (2) 2010.11.27

nm 명령은 주어진 라이브러리의 심볼 리스트를 보고한다.
라이브러리, 컴파일된 오브젝트 모듈, 공유 오브젝트 파일, 독립 실행 파일 등의 바이너리 파일을 검사해서 그 파일 들에 저장된 내용 또는 메타 정보를 표시한다.

GNU 프로젝트는 높은 기능을 갖춘 nm 프로그램을 GNU Binutils 패키지에 포함시키고 있다.
GNU 툴체인의 다른 부분과 함께 주어진 nm 바이너리는 특정 컴퓨터 아키텍쳐와 바이너리 포멧만을 위해 컴파일 된 것이므로 의심스런 바이너리를 검사하기 위해 nm을 사용하는 보안 전문가들은 보통 여러 타겟 용으로 만들어 놓은 nm 바이너리를 갖고 있다.


사용 예 - 특정한 라이브러리 찾기
특정한 함수를 사용하여 컴파일을 하다 보면 링크 에러가 발생할 때가 있다. 이럴 때는 그 함수를 정의하고 있는 라이브러리를 링크해 주어야 한다.

렇게 헤더 파일에는 프로토타입이 선언되어 있지만 링크시에 에러가 발생하면 쉘에서 다음과 같이 실행한다.
# nm -A /usr/lib/*.a 2>/dev/null | grep [function_name]

nm 명령어로 모든 함수명을 출력한다.
그럼 원하는 함수가 포함되어 있는 라이브러리 파일 이름을 발견할 수 있다.

2>/dev/null은 에러 메시지를 표시 하지 않겠다는 뜻이다.
1은 표준 출력 2는 표준 에러 출력을 의미하며 이것을 null device로 리다이렉트시키면 출력이 되지 않는다.

그럼 이제 컴파일러 옵션에 다음과 같이 추가한다.
-l[라이브러리 이름에서 앞의 lib를 떼고 뒤의 확장자를 제거한 이름]

즉, libpthread.a의 경우에는 -lpthread라고 추가하면 된다.
# gcc -o hello hello.c -lpthread



nm과 C++ filt 활용
출처 : http://kldp.org/node/68410

프로그램 빌드/디버깅 과정에서 쓸모있는 툴 중 nm(1)이 있다. nm(1)은 간단히 오브젝트 파일에 들어있는 심볼들을 보여준다. 예를 들어 다음과 같은 C 코드(파일 이름 "nm-data.c")를 생각해 보자:
static int global_static = 1234;
const int global_const = 5432;
int global;

void global_function()
{
    static int local_static = 2;
    int local;
}

static void static_function()
{
    extern int extern_int;
    void extern_function(void);

    extern_function();
    extern_int = 0;
}

자세히 볼 것도 없이, 아무런 의미가 없는 코드이다. 위 코드를 "cc -c nm-data.c"로 컴파일해서 nm으로 그 내용을 보면 다음과 같다:
$ nm nm-data.o
U extern_function
U extern_int
00000004 C global
00000000 R global_const
00000000 T global_function
00000000 d global_static
00000004 d local_static.0
00000008 t static_function
$ _

nm의 출력은 크게 3개의 열로 되어 있다. 첫 번째 열은 심볼 값을, 두 번째 열은 심볼 타입을, 세 번째 열은 심볼 이름을 나타낸다.
심볼 값은 생략 가능하고, 보통 table offset 값이나 virtual address를 나타낸다. 심볼 타입은 한 글자 알파벳으로 되어 있고, 심볼 이름은 말 그대로 이름을 나타낸다.

이 글에서는 심볼 타입에 대해서 주로 다룰 것이다. 먼저 심볼 타입은 A, B, C, D, G, I, N, R, S, T, U, V, W, -, ?가 있으며, 이 중 알파벳은 대소문자가 모두 가능하다. 사실 다 외워 둘 필요는 없고, 딱 하나만 외워 두면 되는데 그건 바로 U이다. U는 Undefined를 뜻하며, 이 오브젝트 파일이 심볼을 참조하고 있지만 정의가 없을 경우에 U로 표시한다. 
소스를 보면, 함수 extern_function()을 호출하고 있지만, 이 함수에 대한 정의는 존재하지 않는다. 또, 전역 변수 extern_int에 0을 대입하고 있지만 이 변수의 정의도 없다. nm은 이러한 심볼들에 대하여 U 타입으로 나타낸다. T는 이 심볼이 text 섹션에 있다는 것 즉, 함수를 의미한다. R은 read only data section, 상수를 의미한다. C는 common, 초기화되지 않은 데이터를 의미한다.
자세한 것은 man 1 nm 또는 info nm을..

여기까지 알았으면, 경험 많은 프로그래머라면 nm이 어떤 경우에 도움을 줄 수 있는지 바로 알 수 있을 것이다. 바로 이름이 충돌날 때(naming conflict)인데, 예를 들어 다음과 같은 코드(파일 이름: nm-ex.c)를 보자:
void f1(void)
{

}

int main(void)
{
    fl();
    return 0;
}

정의한 함수는 f1(), 즉 "소문자 에프-숫자 일"이다. 그리고 호출한 함수는 "소문자 에프-소문자 엘"이다. 서로 다른 것에 주의 바란다. 그러나 이 코드를 작성한 프로그래머는 두 함수 이름이 서로 같다고 착각하고 있다고 가정하자. 이 경우 컴파일 해 보면, 다음과 같은 에러가 발생한다:
$ cc nm-ex.c
/tmp/ccQQbww3.o: In function `main':
nm-ex.c:(.text+0x16): undefined reference to `fl'
collect2: ld returned 1 exit status
~$ _

"응? 왜 에러가 나지? 분명 함수 fl()을 정의하고 호출했는데, 왜 fl()이 없다고 하지?"라고 생각할 것이다. 이 경우 object 파일을 만들고 nm으로 출력해 보면 그 차이를 알 수 있다:
$ cc -c nm-ex.c
$ nm nm-ex.o
00000000 T f1
U fl
00000005 T main
$ _

즉 정의한 함수는 타입이 T로 출력된 f1이고, 호출한 함수는 정의되지 않은 타입 U로 표시된 fl인 것을 알 수 있다. 즉, 타이핑 실수로 함수 이름을 서로 다르게 만들어 두었기 때문에, 두 심볼로 표시된 것이다. 만약 올바르게 한 함수 이름으로 코드가 만들어졌다면 U 타입 심볼은 만들어지지 않았을 것이다.

또 다음과 같은 C++ 소스를 보자(파일 이름: nm-ex.cc):
class foo
{
public:
    foo();
    ~foo();

    void work(void);
    void work(int i);
};

foo::foo() {}
foo::~foo() {}

void foo::work(void) {}
void foo::work(int i) {}

이것을 컴파일하고 nm으로 출력하면 다음과 같다:
$ c++ -c nm-ex.cc
$ nm nm-ex.o
0000001e T _ZN3foo4workEi
00000018 T _ZN3foo4workEv
00000006 T _ZN3fooC1Ev
00000000 T _ZN3fooC2Ev
00000012 T _ZN3fooD1Ev
0000000c T _ZN3fooD2Ev
$ _

C++ name mangling 때문에, 심볼 이름을 알아보기 힘들 것이다. 이 경우, c++filt(1)라는 툴을 쓰면 쉽게 알아 볼 수 있다:
$ nm nm-ex.o | c++filt
0000001e T foo::work(int)
00000018 T foo::work()
00000006 T foo::foo()
00000000 T foo::foo()
00000012 T foo::~foo()
0000000c T foo::~foo()
$ _

nm(1)은 오브젝트 파일 이외에, 실행 파일, 라이브러리 파일에도 모두 동작한다. 특히, 문서나 헤더 파일이 없는 라이브러리가 어떤 함수들을 제공하는지 훑어볼 때에도 유용하다:
$ nm libwhat_is_this.a

또, nm은 이러한 목적 이외에도, 나중에 다뤄 볼 objcopy와 함께 object 파일을 직접 조작할 때 자주 쓰인다(파일을 처리할 때 ls 명령이 얼마나 자주 쓰이는지 생각해 보면, object 파일을 처리할 때 nm이 얼마나 자주 쓰이는지 쉽게 유추할 수 있다).
-------------------------------------------------------------------------------------------------------

Usage : nm [option(s)] [file(s)]
 List symbols in [file(s)] (a.out by default).

 The options are:
  -a, --debug-syms       Display debugger-only symbols
  -A, --print-file-name  Print name of the input file before every symbol
  -B                     Same as --format=bsd
  -C, --demangle[={none,auto,gnu,lucid,arm,hp,edg,gnu-v3,java,gnat,compaq}]
                         Decode low-level symbol names into user-level names
      --no-demangle      Do not demangle low-level symbol names
      --demangler=<dso:function> Set dso and demangler function
  -D, --dynamic          Display dynamic symbols instead of normal symbols
      --defined-only     Display only defined symbols
  -e                     (ignored)
  -f, --format=FORMAT    Use the output format FORMAT.  FORMAT can be `bsd', `sysv' or `posix'.  The default is `bsd'
  -g, --extern-only      Display only external symbols
  -l, --line-numbers     Use debugging information to find a filename and line number for each symbol
  -n, --numeric-sort     Sort symbols numerically by address
  -o                     Same as -A
  -p, --no-sort          Do not sort the symbols
  -P, --portability      Same as --format=posix
  -r, --reverse-sort     Reverse the sense of the sort
  -S, --print-size       Print size of defined symbols
  -s, --print-armap      Include index for symbols from archive members
      --size-sort        Sort symbols by size
      --special-syms     Include special symbols in the output
      --synthetic        Display synthetic symbols as well
  -t, --radix=RADIX      Use RADIX for printing symbol values
      --target=BFDNAME   Specify the target object format as BFDNAME
  -u, --undefined-only   Display only undefined symbols
  -X 32_64               (ignored)
  -h, --help             Display this information
  -V, --version          Display this program's version number

nm: supported targets: elf32-i386 a.out-i386-linux efi-app-ia32 elf32-little elf32-big srec symbolsrec tekhex binary ihex trad-core

Report bugs to <URL:http://www.sourceware.org/bugzilla/> and hjl@lucon.org.

http://korea.gnu.org/manual/release/binutils/binutils_3.html#SEC5


                                    

주민등록번호 각 자리별 의미


12번째 코드는 보통 많아야 2~3이므로
4를 넘어가는 경우 조작된 주민등록번호 라는걸 알 수 있다.

 마지막 오류검증번호는 앞에 12자리를 이용하여 생성이 되고 그 공식은 아래와 같다.



예를들어 주민번호 7 8 0 9 2 5 - 1 3 2 4 0 1 1
위의 예를 들은 주민번호를 이용하여 계산해보면

2*7 + 3*8 + 4*0 + 5*9 + 6*2 + 7*5 + 8*1 + 9*3 + 2*2 + 3*4 +4*0 + 5*1 =186
186 / 11 = 16(몫) ----- 10(나머지)
11 - 10(나머지) = 1 (검증코드)

7 8 0 9 2 5 - 1 3 2 4 0 1 X 에서 X=1 라는 것입니다.

간단한 주민등록번호 생성, 검사 프로그램을 만들 수 있습니다~!!
하지만 에러검증코드가 결국 1~9이니 신뢰도가 낮은 웹사이트를 가입할때는
아무렇게나 적고 뒷자리만 적어주면되니 유용하게 사용하시길 바랍니다.

p.s
타인의 주민등록번호를 임의로 사용하면 '주민등록법'에 의해 3년 이하의 징역
또는 1천만 원 이하의 벌금이 부과될 수 있습니다.
관련법률_주민등록법 제37조(벌칙) 제10호 

'Computer Science > Languages' 카테고리의 다른 글

[MFC] BMP 비트맵 투명 그리기  (0) 2015.02.23
[MFC] 부모 다이얼로그 함수 변수 호출  (0) 2014.11.18
[MFC] force shutdown process  (0) 2014.04.06
[C/C++] 주민등록번호 규칙  (0) 2010.12.31
Dev-C++ 4.9.9.2 , C/C++ Compiler  (0) 2010.12.01
요일구하는 공식  (0) 2010.11.28

공유메모리와 관련 함수

1. 프로세스와 메모리

  모든 프로세스는 자신의 업무를 수행하기 위해서 필요한 자료를 저장하기 위해 각자 메모리공간을 차지한다.

이러한 메모리공간에는 CPU에 의해 수행되는 명령어들, 프로그램 시작시 정의되고 초기화된 데이타, 프로그램 시작시 정의되었지만 초기화 되지 않은 데이타, 함수호출에 필요한 정보, 동적할당이 이루어지는 데이타등 이 들어간다.


  프로세스는 시작시 혹은 실행중에 이러한 데이타를 저장하고 사용하기 위한 메모리 공간을 커널에 요구하여서 할당받아 사용하게 되는데, 이러한 메모리공간은 기본적으로 메모리를 요청한 프로세스만이 접근가능하도록 되어있다.


  하지만 가끔은 여러개의 프로세스가 특정 메모리 공간을 동시에 접근해야할 필요성을 가질때가 있을것이다.


2. 공유메모리

  모든 프로세스는 각자 자신의 업무수행만을 위한 메모리공간을 차지하게 되는데, 여러개의 프로세스가 특정한 메모리영역을 동시에 접근해야할 경우가 있다. 이때 여러 프로세스가 동시에 접근하고 사용하게 되는 메모리를 공유메모리라 한다.

  공유메모리는 여러 IPC 중에서 가장 빠른 수행속도를 보여준다. 그이유는 하나의 메모리를 공유해서 접근하게 되므로, 데이타 복사와 같은 불필요한 오버헤드가 발생하지 않기 때문으로, 빠른 데이타의 이용이 가능하다.


3. 공유메모리과 관련있는 함수들

다음은 공유메모리에 관련된 함수들이다.

#include <sys/types.h>
#include <sys/shm.h>

int shmget(key_t key, int size, int shmflg)
int shmat ( int shmid, char *shmaddr, int shmflg);
int shmdt( const void *shmaddr)
int shmctl(int shmid, int cmd, struct shmid_ds *buf)


4. 공유메모리의 생성과 접근 과정

(1)공유메모리 생성과 관리

  공유메모리의 생성요청은 최초 공유메모리 영역을 만드는 프로세스가 커널에 공유메모리 공간의 할당을 요청함으로써 이루어지며, 만들어진 공유메모리는 커널에 의해서 관리 되게 된다.

  이런 이유로 한번만들어진 공유메모리는 운영체제를 리부팅하거나, 직접 공유메모리 공간을 삭제시켜주지 않은한, 공유메모리를 사용하는 모든 프로세스가 없어졌다고 하더라도, 계속적으로 유지되게 된다.

  프로세스가 커널에게 공유메모리 공간을 요청하게 되면, 커널은 공유메모리 공간을 할당 해주고, 내부자료구조를 통하여 공유메모리를 관리한다.

(2)공유메모리에의 접근

  공유메모리가 할당되면 key값이 정해진다. 공유메모리에 접근을 하기 위해서는 고유의 공유메모리 key값을 이용하고, 또 이 key값으로인해 통해서 다른 여러개의 공유메모리들과 구분되어 질수 있다.


5. 공유메모리 관련 함수 설명

(1)shmget

int shmget(key_t key, size_t size, int shmflg);

  shmget은 커널에 key를 접근번호로 하는 공유메모리 공간을 요청하고 공유메모리를 가르키는 식별자를 리턴해주는 함수이다. shmget 을 이용해서 새로운 공유메모리 영역을 생성하거나 기존의 공유메모리 영역을 참조할수 있다. 커널에서 성공적으로 공유메모리 공간을 할당하게 되면공유메모리를 가르키는 int형 식별자를 리턴하게 된다.

  두번째의 size에서는 byte단위로 공유메모리의 최소크기를 지정할 수 있다. 새로운 공유메모리를 생성하고자 한다면 크기를 명시해주어야 한다. 존재하는 메모리를 참조한다면 크기는 0으로 명시한다.

  세번째 shmflg는 공유메모리의 접근권한과, 생성방식을 명시하기 위해서 사용한다. 
아규먼트의 생성방식을 지정하기 위해서 IPC_CREAT 와 IPC_EXCL 을 사용할수 있다. 아래 이들에 대해서 설명을 해두었다.

IPC_CREAT 
key 를 이용 새로운 공유메모리 공간을 만든다. 

IPC_EXCL 
IPC_CREAT와 같이 사용(ex. IPC_CREAT | IPC_EXCL | 0666의 형태로..)되며, 공유메모리 공간이 이미 존재할경우 error가 발생하여 -1 을 되돌려준다.

  만약 IPC_CREAT 만 사용된다면 shmget()은 새로 생성되는 공유메모리공간을 지시하는 공유메모리공간 "식별자" 되돌려준다. 만약 입력된 key 값이 지시하는 공유메모리 공간이 이미 존재하고 있다면 존재하는 공유메모리 공간의 "식별자"를 되돌려준다. IPC_EXCL 과 IPC_CREAT 를 같이 사용할경우, 공유메모리 공간이 존재하지 않으면 새로 생성시켜주며, 존재할경우에 error를 되돌려준다.

  shmflg에서는 이외에도 권한을 지정해줄수도 있다. 권한은 파일권한과 동일하게, 유저, 그룹, Other 에 대한 읽기/쓰기 권한을 지정할수 있다. 단 실행권한은 줄수 없도록 되어 있다.

(2)shmat

int shmat(int shmid, char *shmaddr, int shmflg);

  공유메모리 공간을 생성(shmget)했으면, 공유메모리에 접근할수 있는 int형 식별자(공유메모리를 가르키는 식별자)를 얻게 된다. shmat함수는 이 int형 식별자를 이용해서 지금의 프로세스가 공유메모리를 사용가능하도록 "덧붙임" 작업을 하고, 식별자에 해당하는 공유메모리의 주소를 리턴해준다.

  첫번째 shmid는 shmget을 이용해서 얻어낸 식별자를 의미한다.
  두번째 *shmaddr은 메모리가 붙을 주소를 명시하기 위해 사용하는데, 0을 사용할경우 커널이 메모리가 붙을 주소를 명시하게 된다. 특별한 사항이 없다면 0을 사용하도록 한다.
  세번째 shmflg는, 해당 공유메모리를 "읽기전용", "읽기/쓰기 가능" 모드로 열수 있는데, SHM_RDONLY로 하면 읽기전용, 아무값도 지정하지 않을경우(0 혹은 NULL) "읽기/쓰기 가능" 모드로 열리게 된다.

(3)shmdt

int shmdt( const void *shmaddr)

  프로세스가 더이상 공유메모리를 사용할필요가 없을경우 프로세스와 공유메모리를 분리 하기 위해서 사용한다. 이 함수를 호출할 경우 단지 현재 프로세스와 공유메모리를 분리시킬뿐이지, 공유메모리 내용을 삭제하지는 않는다는 점을 기억해야 한다. 
공유메모리를 커널상에서 삭제 시키길 원한다면 shmctl 같은 함수를 이용해야 한다.

  shmdt 가 성공적으로 수행되면 커널은 shmid_ds 의 내용을 갱신한다.
  즉 shm_dtime, shm_lpid, shm_nattch 등의 내용을 갱신하는데, shm_dtime 는 가장 최근에 dettach (즉 shmdt 를 사용한)된 시간, shm_lpid 는 호출한 프로세세의 PID, shm_nattch 는 현재 공유메모리를 사용하는 (shmat 를 이용해서 공유메모리에 붙어있는) 프로세스의 수를 돌려준다. shmdt 를 사용하게 되면 shm_nattch 는 1 감소하게 될것이며, shm_nattch 가 0 즉 더이상 붙어있는 프로세스가 없다라는 뜻이 될것이다. shm_nattch 가 0이 되어있을때 만약 이 공유메모리가 shm_ctl 등에 의해 삭제표시 가 되어 있다면, 이 공유메모리는 삭제되게 된다.

(4)shmctl

int shmctl(int shmid, int cmd, struct shmid_ds *buf)

  이것은 공유메모리를 제어하기 위해서 사용한다. 
  즉 shmid_ds 를 직접 제어함으로써, 해당 공유메모리에 대한 소유자, 그룹 등의 허가권을 변경하거나, 공유메모리를 삭제혹은, 공유메모리의 잠금을 설정하거나 해제하는 등의 작업을 한다.

  두번째 아규먼트를 이용해서 shmid가 가르키는 공유메모리를 제어하며, cmd를 이용해서 원하는 제어를 할수 있다. cmd를 이용해 내릴수 있는 명령에는 다음과 같은 것들이 있다.

IPC_STAT 
공유메모리 공간에 관한 정보를 가져오기 위해서 사용된다. 정보는 buf 에 저장된다.

IPC_SET 
공유메모리 공간에 대한 사용자권한 변경을 위해서 사용된다. 사용자 권한 변경을 위해서는 슈퍼유저 혹은 사용자권한을 가지고 있어야 한다. 

IPC_RMID 
공유메모리 공간을 삭제하기 위해서 사용된다. 이 명령을 사용한다고 해서 곧바로 사용되는건 아니며, 더이상 공유메모리 공간을 사용하는 프로세스가 없을때, 즉 shm_nattch 가 0일때 까지 기다렸다가 삭제된다. 즉 해당 공유메모리 공간에 대해서 삭제표시를 하는거라고 생각하면 된다. 



출처:http://geundi.tistory.com/52


C/C++ 컴파일러인 Dev-C,

Dev-cpp의 장점이라면 오픈소스로 gcc을 기반으로 계속해서 개발되고있고..

또한 GNU(General Public License)를 따르기에 무료로 사용하실 수 있습니다.
 
GNU는 UNIX Compatible Free Software를 제작해온 단체인데,

누구나 가입해서 자유롭게 프로그램을 만들 수 있습니다..

아래 링크에서 다운가능합니다.

http://sourceforge.net/projects/dev-cpp/files/Binaries/Dev-C%2B%2B%204.9.9.2/devcpp-4.9.9.2_setup.exe/download

특별히 설치과정에서 어려운 부분은 없다.

한글을 선택해준다.


동의해주세요



입맛에 따라 선택하거나, 그냥 냅두셔도 상관없다.


설지할 폴더를 지정합니다.



설치끝..!! Turbo C보다는 이쁜(?) UI를 제공한다.




Visual c++보다 프로그램이 가벼워서 저사양컴에서도 부담이 없고요~
모두들 즐거운 코딩하실길 ㅎㅎ!!

'Computer Science > Languages' 카테고리의 다른 글

[MFC] BMP 비트맵 투명 그리기  (0) 2015.02.23
[MFC] 부모 다이얼로그 함수 변수 호출  (0) 2014.11.18
[MFC] force shutdown process  (0) 2014.04.06
[C/C++] 주민등록번호 규칙  (0) 2010.12.31
Dev-C++ 4.9.9.2 , C/C++ Compiler  (0) 2010.12.01
요일구하는 공식  (0) 2010.11.28

안드로이드 마켓에 어플을 제작하여 올리려면 라이센스가 필요하다.

어플을 제작하기위한 이클립스+sdk(software development kit)등은 사이트에서 무료로 제공받을 수 있다.

개발에 필요한 프로그램 및 정보는 아래 사이트를 참고하면된다.

http://developer.android.com/index.html


아래 사이트에서 가입후 라이센스 등록이 가능하고, 25불이다. 
http://market.android.com/publish/signup



 주문항목에 Android-Developer Registration Fee for ..... USD 25.00인것을 확인할 수 있다.
나머지 해당 정보를 입력하면 구입완료~!



App store 개발 라이센스의 1/3정도 가격인 것을 볼때

부담없이 안드로이드를 공부중인 학생이라면 구입해볼만한 가격이다.
  1. repair iphone 2011.06.15 21:33

    좋은 글 잘 보고 갑니다. 다음에도 또 좋은 글 기대 할께요. 퍼가도 되죠?


요일은 간단한 식으로 구할 수 있습니다.

(y+y/4-y/100+y/400+(13*m+8)/5+d)%7

Year, Month, day를 입력받고
해당요일을 구하는 공식입니다.


   if(m<3){  

                y--;

                m+=12;

             }

//Months가 3월보다 빠르면 입력받은 year에서 -1해준다음 Months값을 +12해줍니다    

    


    
result = (y+y/4-y/100+y/400+(13*m+8)/5+d)%7;

   //result 변수에 공식을 대입해서 결과 출력 

 

     printf("%d",result); //요일은 1~7로 표시됩니다. (ex: 5가 금요일)    

    

'Computer Science > Languages' 카테고리의 다른 글

[MFC] BMP 비트맵 투명 그리기  (0) 2015.02.23
[MFC] 부모 다이얼로그 함수 변수 호출  (0) 2014.11.18
[MFC] force shutdown process  (0) 2014.04.06
[C/C++] 주민등록번호 규칙  (0) 2010.12.31
Dev-C++ 4.9.9.2 , C/C++ Compiler  (0) 2010.12.01
요일구하는 공식  (0) 2010.11.28

+ Recent posts