'Development'에 해당되는 글 80건

  1. 2012.04.08 [시간 측정]
  2. 2012.04.08 [랜덤함수 사용법]
  3. 2012.03.16 [GeekOS 과제를 위한 환경설정]
  4. 2011.12.27 [자바에서 sleep]
  5. 2011.12.27 [한 소켓에 여러 인풋/아웃풋 스트림]
  6. 2011.12.01 [Event]
  7. 2011.12.01 [Semaphore]
  8. 2011.12.01 [Mutex]
  9. 2011.12.01 [CriticalSection]의 사용
  10. 2011.11.30 [시스템 함수 정리]

[시간 측정]

Development/Java 2012. 4. 8. 21:04

// 시작 부분에 아래처럼 현재 시간을 계산하고

long start = System.currentTimeMillis();


// 프로그램 본문


// 끝에 아래와 같이 삽입

long end = System.currentTimeMillis();

System.out.println( "실행 시간 : " + ( end - start )/1000.0 +"초");

'Development > Java' 카테고리의 다른 글

[static]  (0) 2012.04.19
[배열 복사]  (0) 2012.04.09
[랜덤함수 사용법]  (0) 2012.04.08
[자바에서 sleep]  (0) 2011.12.27
[한 소켓에 여러 인풋/아웃풋 스트림]  (0) 2011.12.27
Posted by cyj4369
,

public class Foo {
  public static void main(String[] args) {


    // 0.0 ~ 1.0 사이의 실수 난수 구하기
    for (int i = 1; i <= 20; i++)
      System.out.println(Math.random());

/* 출력 결과:
0.8835488755737285
0.7442235907969202
0.04143887519495115
0.7752670113987891
0.525644276817284
0.9810655979902362
0.9857864655525691
0.5176456441171947
0.9534154184106848
0.5711598917262706
0.9167881479510426
0.9683895991289863
0.5570482364156645
0.640266931881892
0.7521635329694171
0.37944742406283405
0.1930044225804538
0.6713601888567906
0.28656122448550325
0.9697966362643208
*/




    // 1 ~ 10 까지의 정수 난수 구하기
    for (int i = 1; i <= 20; i++) {
      int n = (int) (Math.random() * 10) + 1;
      System.out.println(n);
    }

/* 출력 결과:
8
4
2
2
7
1
3
7
10
3
7
2
10
8
3
5
4
10
4
1
*/


  }
}

'Development > Java' 카테고리의 다른 글

[static]  (0) 2012.04.19
[배열 복사]  (0) 2012.04.09
[시간 측정]  (0) 2012.04.08
[자바에서 sleep]  (0) 2011.12.27
[한 소켓에 여러 인풋/아웃풋 스트림]  (0) 2011.12.27
Posted by cyj4369
,
개발환경 설정은 크게 다음과 같은 단계로 나뉩니다.

1. 리눅스 설치 (응?)
2. bochs(GeekOS 실행을 위한 에뮬레이터) 설치
3. nasm (Netwide assembler) 설치
4. GeekOS 다운로드 및 환경설정
5. GeekOS 실행 테스트 


각 단계별로 자세한 내용을 알아보겠습니다.

1. 리눅스 설치


리눅스를 항상 쓰지 않는 이상, 일반적으로 윈도우에서 가상머신으로 리눅스를 설치하고난 후 GeekOS를 사용할 겁니다. 적절한 가상머신을 깔고 진행하면 됩니다. 컴퓨터에 아얘 가상머신이 아닌 리눅스를 설치하고 진행해도 좋습니다. 
저는 노트북에 우분투 10.04을 설치하고 진행했습니다. 우분투 버전은 10.04(리눅스 버전 2.6.x)를 추천하며, 32bit로 설치해야 합니다.

리눅스 설치야 다들 잘 하실 거라 믿고(..) 별다른 부가설명은 하지 않겠습니다.


2. bochs 설치




bochs는 GeekOS 실행을 위해 필요한 에뮬레이터입니다. (홈페이지: http://bochs.sourceforge.net/)
우리는 kernel 위에 bochs라는 emulator를 돌리고 그 위에 GeekOS를 얹어 실행시킬 것입니다.
 홈페이지에서 설치 파일을 다운로드할 수 있지만, 우분투에서는 더 간단하게 설치할 수 있습니다.
터미널에서 다음 명령어를 입력합니다. (bochs, bochs-x 두개를 설치)

sudo apt-get install bochs bochs-x


다음과 같은 화면이 나오면서 bochs가 설치됩니다.


 터미널에서 bochs를 입력했을 때 다음과 같은 화면이 나오면 제대로 설치된 것입니다.



3. nasm 설치



nasm은 GeekOS 컴파일에 필요한 어셈블러입니다. (홈페이지 : http://www.nasm.us/)
최신버전은 호환성에 문제가 있어 2.08대 버전을 사용해야 합니다. 홈페이지로 들어가 Download 링크를 누른 후, 2.08 디렉토리의 linux 디렉토리에서 nasm-2.08-1.i386.rpm을 다운로드합니다.


설치 패키지를 다운로드 한 후, 우분투에서 설치 가능한 패키지로 변환하기 위해 alien을 사용합니다. alien은 다음 명령어로 설치할 수 있습니다.

sudo apt-get install alien


 alien을 설치했다면, 다음 명령어를 입력하여 다운로드한 *.rpm 패키지를 *.deb 패키지로 변환합니다.

sudo alien -k nasm-2.08-1.i386.rpm

 
 변환이 완료되면 다음과 같이 nasm-2.08-1_i386.deb 파일이 생성됩니다.

 
다음, 생성된 설치 패키지를 설치합니다.

sudo dpkg -i nasm-2.08-1_i386.deb

 
nasm 설치가 완료되었다면, 이제 GeekOS를 다운로드하도록 하겠습니다.


4. GeekOS 다운로드 및 환경설정

 

이제 드디어 GeekOS를 다운로드 할 차례입니다. 홈페이지 (
http://geekos.sourceforge.net/)에서 파일을 다운로드하거나, 이 링크 (http://sourceforge.net/projects/geekos/geekos-0.3.0.zip)를 통해 바로 파일을 다운로드합니다.

파일을 다운로드한 후, 적절한 곳에 압축을 해제합니다. 압축을 해제한 후, GeekOS관련 스크립트를 실행할 수 있도록 환경변수에 다음을 추가합니다. 환경변수를 수정하기 위해 홈 디렉토리에서 다음 명령을 입력하여 .bashrc를 엽니다. (여기서는 Gedit을 사용하여 .bashrc를 열었으며, vi나 다른 편집기를 사용해도 무방합니다)

gedit .bashrc


.bashrc를 연 후, 하이라이트된 부분을 추가해줍니다.
이 때, GEEKOS_HOME은 자신이 GeekOS 파일을 압축 해제한 곳의 경로를 입력해야 합니다. 저는 홈 폴더의 /sp 디렉터리에 압축을 풀었기에 다음과 같이 설정했습니다.


이제 GeekOS를 시작하기 위한 절차는 모두 끝났습니다.
첫번째 과제(Project0)을 시작하기 위한 준비를 할 차례입니다. 프로젝트를 시작할 디렉토리로 이동한 후, startProject 명령어를 사용하여 새 프로젝트를 위한 준비를 합니다. 여기에서는 GeekOS관련 파일이 있는 폴더에서 프로젝트를 시작합니다. 다음 명령어를 사용하여 0번 프로젝트를 위한 폴더를 생성합니다.(sudo명령으로 해야된다.)

startProject project0 ./src


 다음과 같이 project0 폴더에 프로젝트에 필요한 파일들이 생성된 것을 확인할 수 있습니다.


!!참고사항!!

모든 과정을 올바로 했는데도 startProject 명령이 제대로 먹히지 않는 경우가 있습니다. 그럴 땐 geekos-0.3.0/scripts폴더에 있는 startProject를 직접 실행시켜주면 됩니다. ~/sp/scripts/startProject project0 ~/sp/src 라고 입력하면 해당 폴더에project0이 만들어질 것입니다.


 이제, 마지막으로 GeekOS 실행을 위해 몇몇 설정을 바꿔야 합니다. build 디렉토리로 이동한 후, Makefile 을 열어 148, 149번째 줄을 다음과 같이 수정합니다.


148줄: GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS)
-> GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) -fno-stack-protector 

149줄: CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror
-> CC_GENERAL_OPTS := $(GENERAL_OPTS) #-Werror 

 
다음, .bochsrc를 연 후 다음 내용으로 대체합니다.

vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest
romimage: file=/usr/share/bochs/BIOS-bochs-latest

megs: 8
boot: floppy 

floppy_bootsig_check: disabled=0
floppya: 1_44=fd.img, status=inserted, write_protected=1
#floppya: 1_44=fd_aug.img, status=inserted

log: ./bochs.out
keyboard_serial_delay: 250
keyboard_paste_delay: 100000
#floppy_command_delay: 500
#vga_update_interval: 300000
#vga: extension=vbe, update_freq=1

vga: extension=vbe
#ips:  1000000
#cpu: count=1, ips=1000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"
#cpu: cpuid_limit_winnt=0

mouse: enabled=0
private_colormap: enabled=0
#i440fxsupport: enabled=0
#pci: enabled=1, chipset=i440fx
#newharddrivesupport: enabled=1

# Uncomment this to write all bochs debugging messages to
# bochs.out.  This produces a lot of output, but can be very
# useful for debugging the kernel.
#debug: action=report


이제 모든 준비가 끝났습니다. GeekOS를 빌드하고 실행해볼 차례입니다.
프로젝트 폴더에서 make 명령을 입력하여 빌드를 수행합니다. 아래는 빌드가 완료된 모습입니다.

 
터미널에서 bochs를 입력하면 bochs 에뮬레이터가 실행되면서 방금 빌드한 GeekOS가 실행되는 것을 확인할 수 있습니다.






ps. 명령 실행이 안되는 부분이 있으면 sudo명령으로 권한을 높여 실행시키길 바랍니다.


'Development > GeekOS' 카테고리의 다른 글

[startProject로 프로젝트 생성 후 발생하는 에러]  (0) 2012.05.01
[startProject하기]  (0) 2012.04.25
Posted by cyj4369
,
try {
     Thread.sleep(3000);
   } catch (InterruptedException e) { }

'Development > Java' 카테고리의 다른 글

[static]  (0) 2012.04.19
[배열 복사]  (0) 2012.04.09
[시간 측정]  (0) 2012.04.08
[랜덤함수 사용법]  (0) 2012.04.08
[한 소켓에 여러 인풋/아웃풋 스트림]  (0) 2011.12.27
Posted by cyj4369
,
한 소켓에 두개의 인풋(또는 아웃풋)스트림을 만들면 에러가 난다.

'Development > Java' 카테고리의 다른 글

[static]  (0) 2012.04.19
[배열 복사]  (0) 2012.04.09
[시간 측정]  (0) 2012.04.08
[랜덤함수 사용법]  (0) 2012.04.08
[자바에서 sleep]  (0) 2011.12.27
Posted by cyj4369
,

[Event]

Development/C/C++ 2011. 12. 1. 20:32


출처
http://jurang5.tistory.com/entry/CreateEvent-사용하기

'Development > C/C++' 카테고리의 다른 글

[C언어 문법: Bit field (콜론 연산자)]  (0) 2012.06.16
[Call by Value와 Call by Reference]  (1) 2012.05.05
[Semaphore]  (0) 2011.12.01
[Mutex]  (0) 2011.12.01
[CriticalSection]의 사용  (0) 2011.12.01
Posted by cyj4369
,

[Semaphore]

Development/C/C++ 2011. 12. 1. 20:18

Semaphore

Mutex와 상당히 유사하다. 물론 Mutex와 비교해서 Semaphore는 다른 특징도 지니고 있다.

Semaphore 함수
1. Semaphore 생성 함수
HANDLE CreateSemaphore (LPSECURITY_ATTRIBUTES     lpSemaphoreAttributes, //보안 속성
LONG       lInitialCount,            // Semaphore의 생성 시 초기값 설정

LONG       lMaximumCount,     // Semaphore가 지닐 수 있는 최대 카운트 값을 결정

LPCTSTR  lpName                  // 생성되는 Semaphore에 이름을 줄 경우 사용

) ;

 

[ 세마포어의 경우, 카운트가 0인 경우 : non-signaled 상태, 0보다 큰 경우 : signaled 상태 ]

2. Semaphore 반환 함수
BOOL   ReleaseSemaphore (

HANDLE     hSemaphore,         // 반환하고자 하는 Semaphore 핸들

LONG         lReleaseCount,      // 증가시킬 크기 (일반적으로 1을 전달)

LPLONG     lpPreviousCount     // 변경되기 전의 카운트 값을 저장할 변수의 포인터를 전달
) ;

[ 반환한다는 것은 Semaphore의 카운트를 증가시킨다는 것을 의미 ]

'Development > C/C++' 카테고리의 다른 글

[Call by Value와 Call by Reference]  (1) 2012.05.05
[Event]  (0) 2011.12.01
[Mutex]  (0) 2011.12.01
[CriticalSection]의 사용  (0) 2011.12.01
[시스템 함수 정리]  (0) 2011.11.30
Posted by cyj4369
,

[Mutex]

Development/C/C++ 2011. 12. 1. 20:04

Mutex (Mutual Exclusion)

CRITICAL_SECTIOn 오브젝트 이용한 방법과 상당히 유사하다. 따라서 Mutex 또한 열쇠라고 생각하고 이해하기 바란다.

 

Mutex 오브젝트 함수
1. Mutex 오브젝트를 생성하는 함수 
HANDLE CreateMutex ( 

LPSECURITY_ATTRIBUTES    lpMutexAttributes,      // 생성된 핸들을 자식 프로세스가 상속 받도록 할 것인가에 대한 설정

BOOL      bInitialOwner,  // TRUE 전달시, 생성된 Mutex의 소유자가 함수를 호출한 쓰레드로 초기화

                                    // FALSE 전달시, Mutex의 소유자가 존재하지 않음

LPCTSTR lpName      // 생성되는 Mutex에 이름을 줄 경우 사용되는 인자 
) ; 

2. 임계 영역에 들어가기 위해 Mutex를 얻는 함수

WaitForSingleObject 함수가 Mutex를 소유하는 역할을 한다.

(이 함수는 커널 오브젝트가 non-signaled 상태에서 signaled 상태가 되기를 기다리는 함수이다.

  타임 아웃을 설정하여 무한 대기 상태에 빠지는 것을 막을 수도 있다.)
 

3. 임계 영역을 나갈 때 Mutex를 반환하는 함수

BOOL ReleaseMutex ( HANDLE hMutex ) ;        // 반환하고자 하는 Mutex를 인자로 전달

 
4. Mutex를 소멸하는 함수

BOOL CloseHandle ( HANDLE  hObject ) ;         // 소멸하고자 하는 커널 오브젝트의 핸들을 전달

Mutex 오브젝트 소유자가 존재하는 경우 non-signaled 상태, 소유자가 존재하지 않는 경우 signal 상태가 된다.

 

 
 

'Development > C/C++' 카테고리의 다른 글

[Event]  (0) 2011.12.01
[Semaphore]  (0) 2011.12.01
[CriticalSection]의 사용  (0) 2011.12.01
[시스템 함수 정리]  (0) 2011.11.30
[Mutex Thread 동기화 예제]  (0) 2011.11.30
Posted by cyj4369
,

InitializeCriticalSection()

 

하나의  공통 데이터(변수나 기타 등등) 를 특정 thread가 사용중이라면

다른 Thread들이 접근하지 못하도록 EnterCriticalSection() 로 락을 겁니다.

 

그때 그 CriticalSection, 임계영역이라고 합니다. 

그 영역을 초기화 해주는 부분입니다.

 

CriticalSection은  Multi Thread에서 가장 일반적으로 사용되는 방법이랍니다.

Multi Thread 에서 동기화하는 방법으로는 CriticalSection, Mutex, Semaphore 방법이 있습니다.

 

Win32에서의 임계영역

Win32에 대한 코드는 모두 C++를 사용했다. Win32에서의 임계영역은 다음과 같은 순서로 한다

-------------------------------------------------------------

//임계영역을 선언한다.
CRITICAL_SECTION cs;

//임계영역을 초기화 한다.
InitializeCriticalSection(&cs);

//임계영역으로 들어간다. 여기서는 한 번에 하나의 Thread만
//임계영역에 들어갈 수 있으며, 이미 임계영역에 들어간 
//Thread가 있으면 다른 Thread는 여기서 대기한다.


EnterCriticalSection(&cs);
try {

     // 한번에 하나의 Thread에 의해서만 실행될 수 있는 블럭이다.

}
finally {
     LeaveCriticalSection(&cs); //임계영역을 빠져나온다.
}
      DeleteCriticalSection(&cs); //임계영역을 정리한다.

'Development > C/C++' 카테고리의 다른 글

[Semaphore]  (0) 2011.12.01
[Mutex]  (0) 2011.12.01
[시스템 함수 정리]  (0) 2011.11.30
[Mutex Thread 동기화 예제]  (0) 2011.11.30
[Sleep함수]  (0) 2011.11.29
Posted by cyj4369
,

*유니코드기반의함수

SBCS 함수

WBCS 기반의 문자열 조작 함수

strlen

size_t wcslen(const wchar_t* string);

Strcpy

wchar_t* wcscpy(wchar_t* dest,const wcahr_t* src)

strncpy

wchar_t* wcsncpy(wchar_t* dest,const wchar_t* src, size_t cnt)

strcat

wchar_t* wcscat(wchar_t* dest,const wchar_t* src)

strncat

wchar_t* wcsncat(wchar_t* dest,const wchar_t* src,size_t cnt)

strcmp

int wcscmp(const wchar_t* s1,const wchar_t* s2)

Strncmp

int wcsncmp(const wchar_t* s1,const wchar_t* s2, size_t cnt)

* 문자열 입출력 함수

SBCS 함수

WBCS 기반의 문자열 입출력 함수

printf

int wprintf(const wchar_t* format [,argument]..);

scanf

int wscanf(const wchar_t* format [,argument]..);

fgets

wchar_t* fgetws (wchar_t* string,int n,

fputs

int fputws (const wchar_t* string,FILE* stream);

* 참고

_wsetlocale(LC_ALL,L"korean"); // #include<locale.h>

=> 유니코드기반으로한글을출력하고싶을사용한다.

=> 함수는나라지역에대한정보를설정하는사용되는함수다.

*tchar.h 헤더파일을참고.

===================================================== 2 ========================================================================

*GetLastError()함수

=> 에러코드를 반환해 준다.

============================================5 장 =============================================================

*GetCurrentDirectory() 함수

원형

DWORD WINAPI GetCurrentDirectory( __in DWORD nBufferLength, __out LPTSTR lpBuffer);

- 인자 값으로 버퍼의 길이와 버퍼의 주소를 넘겨 준다.

*SetCurrentDirecotry() 함수

원형

BOOL WINAPI SetCurrentDirectory( __in LPCTSTR lpPathName);

- 인자 값으로 경로를 세팅해준다. 주소 값.

*CreateProcess() 함수

원형

BOOL WINAPI CreateProcess(
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
__in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in_opt LPVOID lpEnvironment,
__in_opt LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);

원본 위치 <http://msdn.microsoft.com/en-us/library/ms682425%28v=VS.85%29.aspx>

- 인자 값은 5장 CreateProcess판을 참고할 것!!!

*ZeroMemory() 함수

원형

void ZeroMemory( [in] PVOID Destination, [in] SIZE_T Length);

-> PVOID == void*

-> ULONG_PTR == SIZE_T, *PSIZE_T;

=========================================6 장 ================================================

*SetPriorityClass() 함수

- 커널 오브젝트에 저장된 프로세스 우선순위를 높인다.

원형

BOOL WINAPI SetPriorityClass( __in HANDLE hProcess, __in DWORD dwPriorityClass);

- 핸들 값과 , 높일 우선순위가 넘어간다.

*GetCurrentProcess() 함수

- 현재 프로세스의 핸들 정보가 반환 된다.

원형

HANDLE WINAPI GetCurrentProcess(void);

*CloseHandle() 함수

- 핸들 테이블의 핸들을 제거 해주고 커널 오브젝트의 UC를 줄여준다.

원형

BOOL WINAPI CloseHandle( __in HANDLE hObject);

*TerminateProcess() 함수

- 강제로 종료를 요청하는 함수

- 되도록이면 안 쓰는 것이 좋다.

원형

BOOL WINAPI TerminateProcess( __in HANDLE hProcess, __in UINT uExitCode);

================================================7 장 =================================================

*CreateMailslot() 함수

- 메일 슬롯 생성.

원형

HANDLE WINAPI CreateMailslot(

__in LPCTSTR lpName,

__in DWORD nMaxMessageSize,

__in DWORD lReadTimeout,

__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes

);

-> lpName: 생성하는 메일슬롯의 이름을 결정

-> nMaxMessageSize: 메일슬롯의 버퍼 크기를 지정. 0이 전달되면 시스템이 허용하는 최대 크기로 지정.

-> lReadTimeout: 메일슬롯을 통해 전송된 데이터를 읽기 위해서 파일 입출력 함수인 ReadFile 함수가 사용되는데 메일 슬롯이 비어 있다면 데이터가 채워질 때 까지 blocking을 하게 되

데 최대 블로킹 시간을 정해준다. MAILSLOT_WAIT_FOREVER를 인자로 전달하면 무한 블로킹. 0 일 경우 그냥 빠져 나옴.

-> lpSecurityAttributes: 핸들을 상속하기 위한 용도.

*WaitForSingleObject() 함수

- 커널 오브젝트의 상태를 확인할 수 있음.

- Signaled 상태가 되었을 때 반환된다.

- 뮤텍스를 얻을 때에도 쓴다.

원형

DWORD WINAPI WaitForSingleObject(

__in HANDLE hHandle,

__in DWORD dwMilliseconds

);

- hHandle : 커널 오브젝트의 핸들 전달

- dwMilliseconds : 대기 시간 설정. INFINITE를 인자로 전달하면, 무한정 기다림.

- 반환 값 [표]

Return code/value

Description

WAIT_ABANDONED

0x00000080L

정상적이지못한오류발생에의해서반환

WAIT_OBJECT_0

0x00000000L

시그널상태였을반환

WAIT_TIMEOUT

0x00000102L

시간초과

WAIT_FAILED

(DWORD)0xFFFFFFFF

The function has failed. To get extended error information, call GetLastError.

* WaitForMultipleObjects() 함수

원형

DWORD WINAPI WaitForMultipleObjects(

__in DWORD nCount, //배열에 저장된 핸들 개수

__in const HANDLE *lpHandles, // 핸들을 저장하고 있는 배열의 주소

__in BOOL bWaitAll, // 모두 Signaled 상태가 되기(TRUE)를 기다리고자 하는지, 아니면 하나라도 Signaled 상태 반환(FALSE)인지 결정

__in DWORD dwMilliseconds //대기 시간.

);

=> 커널 오브젝트가 둘 이상이고, 핸들이 배열로 묶여 있을 때 가능.

*GetExitCodeProcess() 함수

- 종료 코드를 가져오는 함수.

원형

BOOL WINAPI GetExitCodeProcess(

__in HANDLE hProcess,

__out LPDWORD lpExitCode

);

========================================= 8 장 ===========================================================

*GetCurrentProcess() 함수

- 현재 프로세스의 가짜 핸들을 반환

원형

HANDLE WINAPI GetCurrentProcess(void);

*DuplicateHandle() 함수

- 핸들을 복제 함

원형

BOOL WINAPI DuplicateHandle(

__in HANDLE hSourceProcessHandle, // 복제할 핸들을 소유한 프로세스

__in HANDLE hSourceHandle, // 복제할 핸들

__in HANDLE hTargetProcessHandle, // 복제된 핸들을 소유할 프로세스

__out LPHANDLE lpTargetHandle, // 복제된 핸들 값을 저장할 변수의 주소!!

__in DWORD dwDesiredAccess, // 걍 null

__in BOOL bInheritHandle, //상속 여부

__in DWORD dwOptions //옵션.

);

*CreatePipe() 함수

- 이름 없는 파이프를 생성해주는 함수

- 두 개의 핸들을 얻게 됨.

원형

BOOL WINAPI CreatePipe(

__out PHANDLE hReadPipe, //읽는 핸들

__out PHANDLE hWritePipe, //쓰는 핸들

__in_opt LPSECURITY_ATTRIBUTES lpPipeAttributes,

__in DWORD nSize

);

*CreateNamedPipe() 함수

- 이름 있는 파이프를 생성해주는 함수

- 이름있는 파이프를 만듬.

원형

HANDLE WINAPI CreateNamedPipe(

__in LPCTSTR lpName, // 파이프 이름 지정. 형식: \\.\pipe\pipename

__in DWORD dwOpenMode, //파이프 읽기 또는 쓰기 모드 설정.

__in DWORD dwPipeMode, // 모드 설정.( 데이터 전송 타입, 데이터 수신 타입, 블로킹 모드. 3가지 설정)

__in DWORD nMaxInstances, // 파이프의 최대 개수

__in DWORD nOutBufferSize, // 파이프의 출력 버퍼 사이즈

__in DWORD nInBufferSize, // 입력 버퍼 사이즈

__in DWORD nDefaultTimeOut, // 만료 시간

__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes //보안 속성.

);

*dwPipeMode에 대한 추가 설명

데이터 전송 방식

PIPE_TYPE_BYTE(바이트), PIPE_TYPE_MESSAGE(메시지) : 바이너리 형태로 전송할 것인지 메시지 방식으로 전송할 것 인지 선택

데이터 수신 방식

PIPE_READMODE_BYTE(바이트), PIPE_TYPE_MESSAGE(메시지) : 바이너리 방식(바이트 스트림)으로 읽을 지 메시지 방식으로 읽을지

함수 리턴 방식

PIPE_WAIT(블로킹), PIPE_NOWAIT(넌-블로킹) :무조건 PIPE_WAIT을 전달.

*ConnectNamePipe() 함수

파이프를 연결 요청 대기 상태로 변경시킬 때 사용하는 함수.

원형

BOOL WINAPI ConnectNamedPipe(

__in HANDLE hNamedPipe,

__inout_opt LPOVERLAPPED lpOverlapped

);

*WaitNamedPipe() 함수

- 서버의 대기 시간에 따라 클라이언트를 대기하게 끔 만들어 줌

원형

BOOL WINAPI WaitNamedPipe(

__in LPCTSTR lpNamedPipeName, //파이프 이름

__in DWORD nTimeOut // 대기 시간

);

*SetNamedPipeHandleState() 함수

- 파이프의 모드를 변경시켜준다.

원형

BOOL WINAPI SetNamedPipeHandleState(

__in HANDLE hNamedPipe, //파이프 이름

__in_opt LPDWORD lpMode, //읽기 모드와 함수 리턴방식에 대한 값을 전달.

__in_opt LPDWORD lpMaxCollectionCount, //버퍼링할 수 있는 바이트 크기

__in_opt LPDWORD lpCollectDataTimeout // 버퍼링을 허용하는 최대 시간. 클라이언트와 서버가 같은 PC 상에서 동작한다면 반드시 NULL을 전달해야 한다.

);

*FlushFileBuffers() 함수

- 파일 버퍼를 비우는 역할. 비우면서 전송하는 것?

원형

BOOL WINAPI FlushFileBuffers(

__in HANDLE hFile

);

*DisconnectNamedPipe() 함수

- 클라이언트가 에러 메시지를 받을 수 있도록 도와준다.

원형

BOOL WINAPI DisconnectNamedPipe(

__in HANDLE hNamedPipe

);

*SetEnvironmentVariable() 함수

- 환경변수에 등록한다.

원형

BOOL WINAPI SetEnvironmentVariable(

__in LPCTSTR lpName, //Key

__in_opt LPCTSTR lpValue //value

);

*GetEnvironmentVariable() 함수

- 환경 변수를 key를 통해 value 값을 가지고 와서 버퍼에 저장한다.

원형

DWORD WINAPI GetEnvironmentVariable(

__in_opt LPCTSTR lpName, //key

__out_opt LPTSTR lpBuffer, // value가 담길 버퍼

__in DWORD nSize // 버퍼 사이즈

);

===================================12 장 =========================================

*CreateThread() 함수

- 쓰레드를 생성해주는 함수

원형

HANDLE WINAPI CreateThread(

__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, //핸들의 상속여부를 결정.

__in SIZE_T dwStackSize, //스택 사이즈

__in LPTHREAD_START_ROUTINE lpStartAddress, //함수 포인터

__in_opt LPVOID lpParameter, //함수 전달 인자

__in DWORD dwCreationFlags,

__out_opt LPDWORD lpThreadId //쓰레드 식별자

);

*GetExitCodeThread() 함수

- 쓰레드 종료 시 반환 되는 값을 얻을 수 있다.

원형

BOOL WINAPI GetExitCodeThread(

__in HANDLE hThread,

__out LPDWORD lpExitCode

);

*ExitThread() 함수

- 특정 위치에서 쓰레드의 실행을 종료

원형

VOID WINAPI ExitThread(

__in DWORD dwExitCode

);

- 커널 오브젝트에 등록되는 쓰레드 종료코드를 지정.

*TerminateThread() 함수

- 외부에서 쓰레드를 종료

원형

BOOL WINAPI TerminateThread(

__inout HANDLE hThread,

__in DWORD dwExitCode

);

*_beginthreadex() 함수

- 임계영역에 접근 문제를 해결 하기 위해 독립된 메모리를 할당해준다.

원형

uintptr_t _beginthreadex(

void *security,

unsigned stack_size,

unsigned ( *start_address )( void * ),

void *arglist,

unsigned initflag,

unsigned *thrdaddr

);

*_endthreadex() 함수

- 쓰레드에 할당된 메모리 블록을 해제하는 역할

원형

void _endthreadex(

unsigned retval

);

*SuspendThread() 함수

- Running 상태의 Thread를 Blocked 상태로 만들어 준다

- suspend count를 증가시키는 역할.

원형

DWORD WINAPI SuspendThread(

__in HANDLE hThread

);

*ResumeThread() 함수

- Blocked 상태의 Thread를 Ready 상태로 만들어 준다.

- suspend count를 감소시키는 역할

원형

DWORD WINAPI ResumeThread(

__in HANDLE hThread

);

*SetThreadPriority() 함수

- 쓰레드의 우선순위 세팅

원형

BOOL WINAPI SetThreadPriority(

__in HANDLE hThread,

__in int nPriority

);

- 우선순위는 참고할 것.

*GetThreadPriority() 함수

- 쓰레드의 우선순위를 가져오는 함수

원형

int WINAPI GetThreadPriority(

__in HANDLE hThread

);

============================================ 13 장 ==================================================

*InitializeCriticalSection() 함수

- 크리티컬 섹션 오브젝트를 초기화 해주는 함수

원형

void WINAPI InitializeCriticalSection(

__out LPCRITICAL_SECTION lpCriticalSection

);

*EnterCriticalSection() 함수

- 임계영역에 접근 하기 위해서 크리티컬 섹션 오브젝트를 획득하는 함수

원형

void WINAPI EnterCriticalSection(

__inout LPCRITICAL_SECTION lpCriticalSection

);

*LeaveCriticalSection() 함수

- 임계영역을 빠져 나와서 크리티컬 섹션 오브젝트를 반환하는 함수

원형

void WINAPI LeaveCriticalSection(

__inout LPCRITICAL_SECTION lpCriticalSection

);

*DeleteCriticalSection() 함수

- 크리티컬 섹션 오브젝트의 리소스를 반환 해주는 함수,

원형

void WINAPI DeleteCriticalSection(

__inout LPCRITICAL_SECTION lpCriticalSection

);

-------- 위에는 크리티컬 기반의 동기화에 사용 되는 함수들 --------------

* InterlockedIncrement() 함수

- 임계영역의 값을 동기화 시키고 +1 시켜주는 함수.

원형

LONG __cdecl InterlockedIncrement(

__inout LONG volatile *Addend

);

*InterlockedDecrement() 함수

- 임계영역의 값을 동기화 시키고 -1 시켜주는 함수.

원형

LONG __cdecl InterlockedDecrement(

__inout LONG volatile *Addend

);

------- 위에는 인터락 함수를 이용한 동기화에 사용되는 함수들 -----------------------

*CreateMutex() 함수

- 뮤텍스의 커널 오브젝트의 핸들 값을 반환 한다.

원형

HANDLE WINAPI CreateMutex(

__in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes,

__in BOOL bInitialOwner,

__in_opt LPCTSTR lpName

);

*ReleaseMutex() 함수

- 뮤텍스를 Signaled 상태로 만들어 주는 함수

원형

BOOL WINAPI ReleaseMutex(

__in HANDLE hMutex

);

*OpenMutex() 함수

- 이름있는 뮤텍스의 핸들을 가져 온다.

원형

HANDLE WINAPI OpenMutex(

__in DWORD dwDesiredAccess, //뮤텍스로의 접근권한을 지정.

__in BOOL bInheritHandle, // 핸들 상속.

__in LPCTSTR lpName //뮤텍스의 이름.

);

========================================== 14 장 =========================================================

*CreateEvent() 함수

- 이벤트 오브젝트를 생성하는데 사용 되는 함수.

원형

HANDLE WINAPI CreateEvent(

__in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,

__in BOOL bManualReset, // 수동 리셋(TRUE), 자동리셋(FALSE)

__in BOOL bInitialState, //signaled=TRUE, non-signaled=FALSE

__in_opt LPCTSTR lpName

);

*ResetEvent() 함수

- 수동으로 이벤트 오브젝트를 non-signaled로 바꿔 줄 때 사용

원형

BOOL WINAPI ResetEvent(

__in HANDLE hEvent

);

*SetEvent() 함수

- 이벤트 오브젝트를 signaled 상태로 바꿔 줄 때 사용.

원형

BOOL WINAPI SetEvent(

__in HANDLE hEvent

);

*CreateWaitableTimer() 함수

- 타이머 오브젝트를 생성해주는 함수.

- 타이머 오브젝트는 무조건 non-signaled 상태로 생성된다.

원형

HANDLE WINAPI CreateWaitableTimer(

__in_opt LPSECURITY_ATTRIBUTES lpTimerAttributes,

__in BOOL bManualReset,

__in_opt LPCTSTR lpTimerName

);

*SetWaitableTimer() 함수

- signaled로 바꿀 타이머 설정하는 함수.

원형

BOOL WINAPI SetWaitableTimer(

__in HANDLE hTimer,

__in const LARGE_INTEGER *pDueTime,

__in LONG lPeriod,

__in_opt PTIMERAPCROUTINE pfnCompletionRoutine,

__in_opt LPVOID lpArgToCompletionRoutine,

__in BOOL fResume

);

===================================== 17 장 ========================================

*RaiseException() 함수

- 소프트웨어 예외를 발생시키는 역할.

원형

void WINAPI RaiseException(

__in DWORD dwExceptionCode, // 발생시킬 예외의 형태를 지정

__in DWORD dwExceptionFlags, // 예외발생 이후의 실행방식에 있어서 제한을 둘 때 사용한다.

__in DWORD nNumberOfArguments, // 추가정보의 개수를 지정한다.

__in const ULONG_PTR *lpArguments // 추가정보를 전달한다.

);

1. dwExceptionCode에 대한 설명

=> dwExeptionCode에서 bit 단위 별 의미.

=> C: 커스텀 or Microsoft

=> R: Reserved

=> Sev: 심각 정도. 이건 표 참고(p571)

=> Code: Exception Code를 의미

2. dwExecptionFlags에 대한 설명

- EXEPTION_CONTINUE_EXECUTION을 넘겨 주면 EXECTION_CONTINUEW_EXECUTION의 예외처리 흐름을 막는 용도로 사용된다.

======================================== 18 장 ======================================

* CreateFile() 함수

- 파일을 생성하거나 열 때 핸들 값을 얻어오는 함수.

원형

HANDLE WINAPI CreateFile(

__in LPCTSTR lpFileName, //파일 이름.

__in DWORD dwDesiredAccess, // 읽기/쓰기 모드.

__in DWORD dwShareMode, // 파일 공유 방식 지정.

__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 보안 속성.

__in DWORD dwCreationDisposition, // 파일이 생성 되는 방법.

__in DWORD dwFlagsAndAttributes, // 파일의 특성 정보를 설정.

__in_opt HANDLE hTemplateFile // 기존에 존재하는 파일과 동일한 특성을 가지는 새 파일을 만들 때 사용.

);

-> 기타 속성 값은 MSDN을 참고 할 것.

*ReadFile() 함수

- 파일에 데이터를 읽을 때 사용하는 함수

원형

BOOL WINAPI ReadFile(

__in HANDLE hFile, //읽을 파일 핸들

__out LPVOID lpBuffer, //읽은 데이터를 저장할 버퍼의 주소 값.

__in DWORD nNumberOfBytesToRead, // 읽어 들일 데이터의 크기

__out_opt LPDWORD lpNumberOfBytesRead, // 읽어 들인 데이터의 크기의 변수 주소 값.

__inout_opt LPOVERLAPPED lpOverlapped //

);

*WriteFile() 함수

- 파일에 데이터를 쓸 때 사용하는 함수

원형

BOOL WINAPI WriteFile(

__in HANDLE hFile,

__in LPCVOID lpBuffer,

__in DWORD nNumberOfBytesToWrite,

__out_opt LPDWORD lpNumberOfBytesWritten,

__inout_opt LPOVERLAPPED lpOverlapped

);

*GetFiletime() 함수

- MAC 타임을 얻기 위한 함수.

- FILETIME 구조체는 시간 정보를 나타내는 8바이트 자료형. UTC 기반으로 시간을 표현해 준다.

원형

BOOL WINAPI GetFileTime(

__in HANDLE hFile,

__out_opt LPFILETIME lpCreationTime,

__out_opt LPFILETIME lpLastAccessTime,

__out_opt LPFILETIME lpLastWriteTime

);

* FileTimeToSystemTime() 함수

- 시간 포멧을 변경해준다.

원형

BOOL WINAPI FileTimeToSystemTime(

__in const FILETIME *lpFileTime,

__out LPSYSTEMTIME lpSystemTime

);

* 시간 포멧 변경 시 필요한 구조체.

typedef struct _SYSTEMTIME {

WORD wYear;

WORD wMonth;

WORD wDayOfWeek;

WORD wDay;

WORD wHour;

WORD wMinute;

WORD wSecond;

WORD wMilliseconds;

} SYSTEMTIME, *PSYSTEMTIME;

*SystemTimeToTzSpecificLocalTime() 함수

- UTC를 지역별, 국가별 시간대로 변경해준다.

원형

BOOL WINAPI SystemTimeToTzSpecificLocalTime(

__in_opt LPTIME_ZONE_INFORMATION lpTimeZone, //시간대에 대한 정보.NULL 전달 시 현재 시스템의 시간대 정보가 기준이 된다.

__in LPSYSTEMTIME lpUniversalTime,

__out LPSYSTEMTIME lpLocalTime

);

*GetFileSize() 함수

- file사이즈를 가져오는 함수

- 4G이상은 불가.

원형

DWORD WINAPI GetFileSize(

__in HANDLE hFile,

__out_opt LPDWORD lpFileSizeHigh

);

*GetFileSizeEx() 함수

-4G 이상의 파일 사이즈를 얻어주는 함수

원형

BOOL WINAPI GetFileSizeEx(

__in HANDLE hFile,

__out PLARGE_INTEGER lpFileSize

);

-> LARGE_INTEGER 구조체에는 8Byte를 상하위 비트로 나누어서 담는다.

*GetFileAttributes() 함수

- 파일 특성 정보는 반환 값으로 담긴다.

원형

DWORD WINAPI GetFileAttributes(

__in LPCTSTR lpFileName

);

- 32 bit DWORD 값에 비트 별로 속성 값이 들어 가게 된다. 총 12가지 정보가 들어간다.

- 비트 별 정보는 msdn을 참고할 것!

*SetFileAttributes() 함수

- 파일 특성 정보를 세팅한다

원형

BOOL WINAPI SetFileAttributes(

__in LPCTSTR lpFileName,

__in DWORD dwFileAttributes

);

*GetFileInformationByHandle() 함수

- 핸들을 이용해 파일 정보를 얻어오는 함수

원형

BOOL WINAPI GetFileInformationByHandle(

__in HANDLE hFile,

__out LPBY_HANDLE_FILE_INFORMATION lpFileInformation

);

*_BY_HANDLE_FILE_INFORMATION의 원형

typedef struct _BY_HANDLE_FILE_INFORMATION {

DWORD dwFileAttributes;

FILETIME ftCreationTime;

FILETIME ftLastAccessTime;

FILETIME ftLastWriteTime;

DWORD dwVolumeSerialNumber;

DWORD nFileSizeHigh;

DWORD nFileSizeLow;

DWORD nNumberOfLinks;

DWORD nFileIndexHigh;

DWORD nFileIndexLow;

} BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION;

*GetFullPathName() 함수

- 파일 이름을 통해서 파일경로 정보를 얻어주는 함수

원형

DWORD WINAPI GetFullPathName(

__in LPCTSTR lpFileName,

__in DWORD nBufferLength, //저장 가능한 문자열의 길이임을 주의할 것!!

__out LPTSTR lpBuffer,

__out LPTSTR *lpFilePart //버퍼의 특정 위치를 가리키는 포인터 값이 저장. 마지막 역슬래시 다음 번지 주소 값이 저장됨.

);

*SetFilePointer() 함수

- 파일 포인터의 위치를 정해준다.

원형

DWORD WINAPI SetFilePointer(

__in HANDLE hFile,

__in LONG lDistanceToMove, //32bit 기반일 때 이 인자 값만 사용. 이동시킬 거리를 지정.

__inout_opt PLONG lpDistanceToMoveHigh, //64bit 기반일 때 상위 4Byte 값이 담긴다. 32bit에서는 NULL 전달.

__in DWORD dwMoveMethod

);

*CreateDirectory() 함수

- 디렉터리 생성.

원형

BOOL WINAPI CreateDirectory(

__in LPCTSTR lpPathName,

__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes

);

*RemoveDirectory() 함수

- 디렉토리 제거

원형

BOOL WINAPI RemoveDirectory(

__in LPCTSTR lpPathName

);

*GetCurrentdirectory() 함수

- 현재 디렉토리를 얻어온다.

원형

DWORD WINAPI GetCurrentDirectory(

__in DWORD nBufferLength,

__out LPTSTR lpBuffer

);

*SetCurrentDirectory() 함수

- 현재 디렉토리 위치를 변경한다.

원형

BOOL WINAPI SetCurrentDirectory(

__in LPCTSTR lpPathName

)

* GetSystemDirectory() 함수

- 시스템 디렉터리의 위치를 얻어온다.

원형

UINT WINAPI GetSystemDirectory(

__out LPTSTR lpBuffer,

__in UINT uSize

);

*GetWindowsDirectory() 함수

- window 디렉토리의 위치를 얻어온다

원형

UINT WINAPI GetWindowsDirectory(

__out LPTSTR lpBuffer,

__in UINT uSize

);

*SearchPath() 함수

- 파일의 위치를 찾아준다.

원형

DWORD WINAPI SearchPath(

__in_opt LPCTSTR lpPath,

__in LPCTSTR lpFileName,

__in_opt LPCTSTR lpExtension,

__in DWORD nBufferLength,

__out LPTSTR lpBuffer,

__out_opt LPTSTR *lpFilePart

);

-> 표준 검색 경로

1. 실행 중인 프로그램이 로드 된 디렉토리

2. 현재 디렉토리

3. 시스템 디렉토리

4. windows 디렉토리

5. 환경변수 PATH에 등록된 디렉토리

*FindFirstFile() 함수

- 파일 목록 중 첫 번째 파일의 핸들 값을 반환. 정보는 두 번째 인자에 저장.

원형

HANDLE WINAPI FindFirstFile(

__in LPCTSTR lpFileName,

__out LPWIN32_FIND_DATA lpFindFileData

);

*FindNextFile() 함수

- 파일 목록 중 다음 파일의 핸들 값을 반환. 정보는 두 번째 인자에 저장.

원형

BOOL WINAPI FindNextFile(

__in HANDLE hFindFile,

__out LPWIN32_FIND_DATA lpFindFileData

);

*FindClose() 함수

- 생성된 커널 오브젝트를 해제.

원형

BOOL WINAPI FindClose(

__inout HANDLE hFindFile

);

*파일 정보 저장되는 구조체.

typedef struct _WIN32_FIND_DATA {

DWORD dwFileAttributes;

FILETIME ftCreationTime;

FILETIME ftLastAccessTime;

FILETIME ftLastWriteTime;

DWORD nFileSizeHigh;

DWORD nFileSizeLow;

DWORD dwReserved0;

DWORD dwReserved1;

TCHAR cFileName[MAX_PATH];

TCHAR cAlternateFileName[14];

} WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;

================================================ 19 장 =====================================

*GetOverlappedResult() 함수

- I/O 연산이 완료된 이후에 전송된 데이터 크기 확인을 위함.

원형

BOOL WINAPI GetOverlappedResult(

__in HANDLE hFile, // 입력 및 출력 결과 학인을 위한 파이프 핸들

__in LPOVERLAPPED lpOverlapped, // overlapped 구조체 변수의 주소 값

__out LPDWORD lpNumberOfBytesTransferred, // 실제 전송이 완료된 바이트 크기를 얻기 위한 변수의 주소 값

__in BOOL bWait // I/O 연산이 끝나지 않은 상황에서의 처리를 결정.

);

*WriteFileEx() 함수

- 완료 루틴이 추가 됨.

원형

BOOL WINAPI WriteFileEx(

__in HANDLE hFile,

__in_opt LPCVOID lpBuffer,

__in DWORD nNumberOfBytesToWrite,

__inout LPOVERLAPPED lpOverlapped,

__in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine //완료 루틴.

);

*ReadFileEx() 함수

- 완료 루틴이 추가 됨

원형

BOOL WINAPI ReadFileEx(

__in HANDLE hFile,

__out_opt LPVOID lpBuffer,

__in DWORD nNumberOfBytesToRead,

__inout LPOVERLAPPED lpOverlapped,

__in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine

);

*OVERLAPPED_COMPLETION_ROUTINE 함수 포인터 모양.

원형

typedef VOID (WINAPI *LPOVERLAPPED_COMPLETION_ROUTINE) (

[in] DWORD dwErrorCode,

[in] DWORD dwNumberOfBytesTransfered,

[in] LPVOID lpOverlapped

);

*SetWaitableTimer() 함수

- 완료 루틴 타이머. 일정 시간이 되면 콜백함수를 호출한다.

원형

BOOL WINAPI SetWaitableTimer(

__in HANDLE hTimer,

__in const LARGE_INTEGER *pDueTime,

__in LONG lPeriod,

__in_opt PTIMERAPCROUTINE pfnCompletionRoutine,

__in_opt LPVOID lpArgToCompletionRoutine,

__in BOOL fResume

);

* SetWaitableTimer 함수의 네 번째 인자 값.

원형

VOID CALLBACK TimerAPCProc(

__in_opt LPVOID lpArgToCompletionRoutine,

__in DWORD dwTimerLowValue,

__in DWORD dwTimerHighValue

);

*QueueUserAPC() 함수

- APC Queue에 호출하고자 하는 함수 정보를 전달 할 때 사용하는 함수

원형

DWORD WINAPI QueueUserAPC(

__in PAPCFUNC pfnAPC, //비동기로 호출될 함수를 지정

__in HANDLE hThread, // APC Queue를 소유하는 쓰레드 핸들을 지정.

__in ULONG_PTR dwData // 등록된 함수 호출 시 전달할 인자.

);

========================================== 20 장 =================================================

*VirtualAlloc() 함수

- 가상 메모리를 할당해주는 함수

- MEM_RESERVE 와 MEM_COMMIT으로 메모리의 상태를 설정해줄 수 있다.

원형

LPVOID WINAPI VirtualAlloc(

__in_opt LPVOID lpAddress, //메모리의 시작 주소. NULL 전달시 임의의 주소 할당됨.

__in SIZE_T dwSize, //할당하고자 하는 메모리의 크기를 바이트 단위로.

__in DWORD flAllocationType, //메모리 할당의 타입을 결정. MEM_RESERVE, MEM_COMMIT

__in DWORD flProtect //페이지별 접근방식에 제한을 두는 용도로 사용.

);

*VirtualFree() 함수

- 할당한 메모리를 해제 해주는 함수.

원형

BOOL WINAPI VirtualFree(

__in LPVOID lpAddress,

__in SIZE_T dwSize,

__in DWORD dwFreeType //MEM_DECOMMIT과 MEM_RELEASE 를 전달.

);

*HeapCreate() 함수

- 힙을 생성하는 함수

원형

HANDLE HeapCreate(

DWORD flOptions, // 생성되는 힙의 특성을 부여 (0 을 전달시 가장 일반적인 힙 생성)

// HEAP_GENERATE_EXCEPTIONS : 오류 발생시 NULL이 아닌 예외 발생

// HEAP_NO_SERIALIZE : 생성된 힙의 메모리 할당과 해제에 대해 동기화 처리를 하지 않는다.

SIZE_T dwInitialSize, // dwMaximumSize 에서 지정한 메모리 중에서 초기에 할당할 COMMIT 페이지를 지정한다

SIZE_T dwMaximumSize // 생성되는 힙의 크기 결정.

// 지정하는 크기에 해당하는 페이지의 수만큼 RESERVE 상태가 된다.

// 0이 아닐 경우 힙은 증가 가능 한 메모리(Growable Heap)가 된다

);

출처http://dakuo.tistory.com/128

*HeapDestroy() 함수

- 힘을 해제시키는 함수

원형

BOOL HeapDestroy(

HANDLE hHeap // 반환하고자 하는 힙의 핸들

);

출처http://dakuo.tistory.com/128

*HeapAlloc() 함수

- 힙에 메모리를 할당하는 함수.

- 요청 크기에 해당하는 페이지 수만큼 COMMIT 상태로 변경시킨다.

원형

LPVOID HeapAlloc(

HANDLE hHeap, // 메모리 할당이 이뤄질 힙의 핸들

DWORD dwFlags, // HEAP_GENERATE_EXCEPTIONS : 오류 발생시 NULL이 아닌 예외 발생

// HEAP_NO_SERIALIZE : 함수 호출 시 동기화 처리되지 않는다.

// (HeapCreate 함수호출에서 지정했다면 중복 지정 할 필요는 없다)

// HEAP_ZERO_MEMORY : 할당된 메모리는 0으로 초기화

// 둘 이상의 속성을 비트 단위 연산자 OR( | )로 동시 지정 가능

SIZE_T dwBytes // 할당하고자 하는 메모리의 크기를 지정

// (증가 가능 한 힙이 아닐 경우 최대 크기 0x7FFF8)

);

출처http://dakuo.tistory.com/128

*HeapFree() 함수

- 힙에 메모리를 해제하는 함수

- Reserve 상태도 가능

원형

BOOL HeapFree(

HANDLE hHeap, // 해제할 메모리를 담고 있는 힙을 지정

DWORD dwFlags, // HEAP_NO_SERIALIZE 가 인자로 올 수 있다, 일반적 : 0

// (HeapCreate 함수호출에서 지정했다면 중복지정할 필요는 없다)

LPVOID lpMem // 해제할 메모리의 시작 주소 지정

);

출처http://dakuo.tistory.com/128

*CreateFileMapping() 함수

- 파일 연결 오브젝트 생성을 위한 함수

원형

HANDLE WINAPI CreateFileMapping(

__in HANDLE hFile, //파일 핸들

__in_opt LPSECURITY_ATTRIBUTES lpAttributes, //보안 속성

__in DWORD flProtect, //PAGE_READONLY, PAGE_READWRITE

__in DWORD dwMaximumSizeHigh, // 연결할 메모리 최대 크기의 상위 4 바이트, 대용량 파일이 아니면 보통 0

__in DWORD dwMaximumSizeLow, // 메모리 최대 크기의 하위 4 바이트

__in_opt LPCTSTR lpName // 파일 연결 오브젝트의 이름 지정. NULL을 전달 할 수 있음

);

*MapViewOfFile() 함수

- 파일과 메모리를 실제로 매핑 시켜주는 함수.

원형

LPVOID WINAPI MapViewOfFile(

__in HANDLE hFileMappingObject, // 커널 오브젝트의 핸들

__in DWORD dwDesiredAccess, // 연결된 메모리의 접근권한. CreateFileMapping 함수에대해 종속적이다.?

__in DWORD dwFileOffsetHigh, // 메모리에 연결할 파일의 오프셋을 지정한다.

__in DWORD dwFileOffsetLow, // 오프셋 하위 4 비트

__in SIZE_T dwNumberOfBytesToMap //메모리에 연결할 실제 크기를 바이트 단위로 지정.

);

*UmapViewOfFile() 함수

- 매핑된 메모리를 해제.

원형

BOOL WINAPI UnmapViewOfFile(

__in LPCVOID lpBaseAddress

);

*FlushViewOfFile() 함수

- 메모리에 캐쉬된 데이터를 파일에 저장하게 해주는 함수.

원형

BOOL WINAPI FlushViewOfFile(

__in LPCVOID lpBaseAddress, //파일에 저장할 메모리의 시작 주소

__in SIZE_T dwNumberOfBytesToFlush // 파일에 저장할 데이터 크기를 바이트 단위로 지정.

);

[출처] 시스템 함수 정리|작성자 smuoon4680

'Development > C/C++' 카테고리의 다른 글

[Mutex]  (0) 2011.12.01
[CriticalSection]의 사용  (0) 2011.12.01
[Mutex Thread 동기화 예제]  (0) 2011.11.30
[Sleep함수]  (0) 2011.11.29
[thread에서 _beginthreadex의 void *arglist로 스레드에 여러 인수 넘겨주는 방법]  (0) 2011.11.23
Posted by cyj4369
,