.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 중국어 웹사이트의 기타 관련 기사를 참조하세요!