카테고리:

2 분 소요

프로세스 핸들

프로세스 핸들(Process Handle)은 컴퓨터 운영 체제에서 프로세스를 식별하고 관리하기 위한 개념이다. 프로세스 핸들은 보통 운영 체제 API에서 제공되며, 각 언어 및 환경에서는 해당 API를 이용하여 프로세스 핸들을 얻고 조작한니다. 프로그래밍에서는 핸들을 이용하여 프로세스나 자원을 제어하는 데 사용한다.

주요한 Windows API 함수 및 프로세스 핸들과 관련된 몇 가지가 있다.

  1. CreateProcess 함수: 새로운 프로세스를 생성하고 핸들을 반환한다.
  2. OpenProcess 함수: 기존 프로세스의 핸들을 얻는다.
  3. CloseHandle 함수: 프로세스 핸들을 닫는다.

소스 코드

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace Win32 {
    internal class Program {
        const uint PROCESS_ALL_ACCESS = 0x1F0FFF;

        [DllImport("kernel32.dll")]
        public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId);

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool CloseHandle(IntPtr hObject);

        static void Main(string[] args) {
            string processName = "notepad"; // 대상 프로세스명 입력
            int pid = GetProcessId(processName);

            if (pid != -1) {
                IntPtr processHandle = OpenProcess(PROCESS_ALL_ACCESS, false, pid);

                if (processHandle != IntPtr.Zero) {
                    Console.WriteLine($"프로세스 핸들 '{processHandle}'을 열었습니다.");
                    CloseHandle(processHandle);
                } else {
                    Console.WriteLine("프로세스 핸들을 열 수 없습니다.");
                }
            } else {
                Console.WriteLine($"프로세스 '{processName}'을 찾을 수 없습니다.");
            }
        }

        private static int GetProcessId(string processName) {
            Process[] processes = Process.GetProcessesByName(processName);

            if (processes.Length > 0) {
                return processes[0].Id;
            } else {
                return -1;
            }
        }
    }
}

프로세스 핸들은 일반적으로 프로세스의 생성, 제어, 모니터링 등 다양한 작업에서 사용된다. 다만, 핸들을 올바르게 관리하지 않으면 리소스 누수가 발생할 수 있으므로, CloseHandle 함수를 사용하여 핸들을 명시적으로 닫는 것이 중요하다.

참고

https://learn.microsoft.com/ko-kr/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
https://blog.naver.com/PostView.naver?blogId=tipsware&logNo=221065382244
https://chanos.github.io/post/Window-API-Win32-API에서-제공하는-자료형데이터-타입-모음과-핸들HANDLE

태그: closehandle, Handle, KERNEL32.DLL, openprocess, Process Handle, winapi, 프로세스 핸들, 핸들

업데이트: