>백엔드 개발 >C++ >.NET에서 PInvoke와 함께 CreateJobObject 및 SetInformationJobObject를 사용하여 프로세스 종료를 관리하는 방법은 무엇입니까?

.NET에서 PInvoke와 함께 CreateJobObject 및 SetInformationJobObject를 사용하여 프로세스 종료를 관리하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-27 13:46:10602검색

How to Use CreateJobObject and SetInformationJobObject with PInvoke in .NET to Manage Process Termination?

.NET에서 CreateJobObject/SetInformationJobObject PInvoke의 작업 예

질문:

I' CreateJobObject를 사용하는 실제 예제를 만드는 데 어려움을 겪었습니다. 및 PInvoke를 통한 SetInformationJobObject 메서드. 다양한 시도에도 불구하고 SetInformationJobObject 메서드를 사용하여 JOBOBJECT_BASIC_LIMIT_INFORMATION을 설정하려고 하면 오류가 발생합니다.

답변:

문제를 해결하려면 복잡한 부분을 자세히 살펴보겠습니다. 을 통해 .NET에서 CreateJobObject 및 SetInformationJobObject 작업을 수행합니다. 핀보크. 다음은 기능적 예가 포함된 단계별 가이드입니다.

1. 작업 개체 생성:

먼저 CreateJobObject 메서드를 사용하여 작업 개체를 생성합니다. 이 메서드는 두 가지 인수, 즉 보안 속성과 작업 이름(비워 두겠습니다)을 사용합니다.

IntPtr jobHandle = CreateJobObject( null , null );

2. 작업 개체에 프로세스 추가:

다음으로 새로 생성된 작업 개체에 프로세스를 할당해야 합니다. 이를 위해 AssignProcessToJobObject 메소드가 사용됩니다.

AssignProcessToJobObject( jobHandle , myProcess.Handle );
AssignProcessToJobObject( jobHandle , Process.GetCurrentProcess().Handle );

3. 작업 제한 설정:

이제 SetInformationJobObject 메서드를 사용하여 작업 제한을 설정하겠습니다. 특히 JOBOBJECT_LIMIT_KILL_ON_JOB_CLOSE 플래그 설정에 중점을 둘 것입니다.

JOBOBJECT_BASIC_LIMIT_INFORMATION limits = new JOBOBJECT_BASIC_LIMIT_INFORMATION();
limits.LimitFlags = (short)LimitFlags.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
IntPtr pointerToJobLimitInfo = Marshal.AllocHGlobal( Marshal.SizeOf( limits ) );
Marshal.StructureToPtr( limits , pointerToJobLimitInfo , false );   
SetInformationJobObject( job , JOBOBJECTINFOCLASS.JobObjectBasicLimitInformation , pionterToJobLimitInfo ,  ( uint )Marshal.SizeOf( limits ) )

이 코드에서는 JOBOBJECT_BASIC_LIMIT_INFORMATION 구조를 정의하고 LimitFlags를 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE로 설정했습니다. 이렇게 하면 작업 개체의 한 프로세스가 종료되면 다른 프로세스도 자동으로 종료됩니다.

전체 코드 예:

다음은 다음을 통합하는 전체 코드 예입니다. 다음 단계는 다음과 같습니다.

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

class Program
{
    [DllImport( "kernel32.dll" , EntryPoint = "CreateJobObjectW" , CharSet = CharSet.Unicode )]
    public static extern IntPtr CreateJobObject( IntPtr JobAttributes , string lpName );

    [DllImport( "kernel32.dll" )]
    static extern bool SetInformationJobObject( IntPtr hJob , JOBOBJECTINFOCLASS JobObjectInfoClass , IntPtr lpJobObjectInfo , uint cbJobObjectInfoLength );

    public enum JOBOBJECTINFOCLASS
    {
        JobObjectAssociateCompletionPortInformation = 7 ,
        JobObjectBasicLimitInformation = 2 ,
        JobObjectBasicUIRestrictions = 4 ,
        JobObjectEndOfJobTimeInformation = 6 ,
        JobObjectExtendedLimitInformation = 9 ,
        JobObjectSecurityLimitInformation = 5
    }


    [StructLayout( LayoutKind.Sequential )]
    struct JOBOBJECT_BASIC_LIMIT_INFORMATION
    {
        public Int64 PerProcessUserTimeLimit;
        public Int64 PerJobUserTimeLimit;
        public Int16 LimitFlags;
        public UIntPtr MinimumWorkingSetSize;
        public UIntPtr MaximumWorkingSetSize;
        public Int16 ActiveProcessLimit;
        public Int64 Affinity;
        public Int16 PriorityClass;
        public Int16 SchedulingClass;
    }

    public enum LimitFlags
    {
        JOB_OBJECT_LIMIT_ACTIVE_PROCESS = 0x00000008 ,
        JOB_OBJECT_LIMIT_AFFINITY = 0x00000010 ,
        JOB_OBJECT_LIMIT_BREAKAWAY_OK = 0x00000800 ,
        JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION = 0x00000400 ,
        JOB_OBJECT_LIMIT_JOB_MEMORY = 0x00000200 ,
        JOB_OBJECT_LIMIT_JOB_TIME = 0x00000004 ,
        JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x00002000 ,
        JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME = 0x00000040 ,
        JOB_OBJECT_LIMIT_PRIORITY_CLASS = 0x00000020 ,
        JOB_OBJECT_LIMIT_PROCESS_MEMORY = 0x00000100 ,
        JOB_OBJECT_LIMIT_PROCESS_TIME = 0x00000002 ,
        JOB_OBJECT_LIMIT_SCHEDULING_CLASS = 0x00000080 ,
        JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK = 0x00001000 ,
        JOB_OBJECT_LIMIT_WORKINGSET = 0x00000001
    }


    [DllImport( "kernel32.dll" )]
    [return: MarshalAs( UnmanagedType.Bool )]
    static extern bool AssignProcessToJobObject( IntPtr hJob , IntPtr hProcess );

    static void Main( string[] args )
    {
        Process myProcess = // POPULATED SOMEWHERE ELSE

        // Create Job & assign this process and another process to the job
        IntPtr jobHandle = CreateJobObject( null , null );
        AssignProcessToJobObject( jobHandle , myProcess.Handle );
        AssignProcessToJobObject( jobHandle , Process.GetCurrentProcess().Handle );

        // Ensure that killing one process kills the others                
        JOBOBJECT_BASIC_LIMIT_INFORMATION limits = new JOBOBJECT_BASIC_LIMIT_INFORMATION();
        limits.LimitFlags = (short)LimitFlags.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
        IntPtr pointerToJobLimitInfo = Marshal.AllocHGlobal( Marshal.SizeOf( limits ) );
        Marshal.StructureToPtr( limits , pointerToJobLimitInfo , false );   
        SetInformationJobObject( job , JOBOBJECTINFOCLASS.JobObjectBasicLimitInformation , pionterToJobLimitInfo ,  ( uint )Marshal.SizeOf( limits ) )
    }
}

이 코드는 작업 개체를 생성하고 현재 프로세스와 다른 프로세스(다음으로 지정됨)를 추가합니다. myProcess)를 작업 개체에 추가하고 JOBOBJECT_LIMIT_KILL_ON_JOB_CLOSE 플래그를 설정합니다. 이렇게 하면 현재 프로세스나 myProcess 중 하나가 종료되면 다른 프로세스도 자동으로 종료됩니다.

위 내용은 .NET에서 PInvoke와 함께 CreateJobObject 및 SetInformationJobObject를 사용하여 프로세스 종료를 관리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.