System Programming

  • OS의 자체 기능을 추가 제작하는 프로그래밍
  • OS를 활용하는 프로그래밍

Process 생성

  • CreateProcessW(), CreateProcessA()

W는 유니코드, A는 아스키코드

윈도우는 유니코드를 사용하기 때문에 CreateProcess()는 W를 의미

A도 결국 유니코드로 변환해서 사용

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void main()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

	TCHAR szBuffer[MAX_PATH + _MAX_FNAME] = {L"notepad.exe"}; -> Read, Write가 되는 스택 메모리(지역 변수)

    // Start the child process. 
    if( !CreateProcess( NULL,   // No module name (use command line)
        szBuffer,        // Command line -> 여기서 Write가 일어남, Read만 되는 문자열 상수가 오면 안됨
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi )           // Pointer to PROCESS_INFORMATION structure
    ) 
    {
    	CString strTmp;
        strTmp.Format(L"CreateProcess failed (%d).", GetLastError());
		AfxMessageBox(strTmp);
        return;
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}
  • GetLastError()의 값은 도구 - 오류 조회에서 어떤 오류인지 확인 가능

Reference

https://learn.microsoft.com/ko-kr/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa

 

CreateProcessA 함수(processthreadsapi.h) - Win32 apps

새 프로세스 및 기본 스레드를 만듭니다. 새 프로세스는 호출 프로세스의 보안 컨텍스트에서 실행됩니다. (ANSI)

learn.microsoft.com

 

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

[System] High-Level File I/O  (1) 2024.01.24
[System] Low-Level File I/O  (1) 2024.01.23
[System] Thread  (0) 2024.01.04
[System] Event  (0) 2024.01.03
[System] WaitForSingleObject  (0) 2024.01.03