Arbeitsbeispiel für CreateJobObject/SetInformationJobObject PInvoke in .NET
Frage:
Ich' Ich hatte Mühe, ein funktionierendes Beispiel für die Verwendung der Methoden CreateJobObject und SetInformationJobObject zu erstellen PInvoke. Trotz verschiedener Versuche stoße ich auf Fehler, wenn ich versuche, JOBOBJECT_BASIC_LIMIT_INFORMATION mithilfe der SetInformationJobObject-Methode festzulegen.
Antwort:
Um Ihr Problem zu lösen, lassen Sie uns in die Feinheiten eintauchen der Arbeit mit CreateJobObject und SetInformationJobObject in .NET über PInvoke. Hier ist eine Schritt-für-Schritt-Anleitung mit einem Funktionsbeispiel:
1. Erstellen Sie ein Jobobjekt:
Zuerst erstellen wir ein Jobobjekt mit der Methode CreateJobObject. Diese Methode benötigt zwei Argumente: ein Sicherheitsattribut und den Jobnamen (den wir leer lassen).
IntPtr jobHandle = CreateJobObject( null , null );
2. Prozesse zum Jobobjekt hinzufügen:
Als nächstes müssen wir unserem neu erstellten Jobobjekt Prozesse zuweisen. Hierzu wird die Methode AssignProcessToJobObject verwendet.
AssignProcessToJobObject( jobHandle , myProcess.Handle ); AssignProcessToJobObject( jobHandle , Process.GetCurrentProcess().Handle );
3. Joblimits festlegen:
Jetzt legen wir Joblimits mithilfe der SetInformationJobObject-Methode fest. Wir konzentrieren uns insbesondere auf das Setzen des Flags 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 ) )
In diesem Code haben wir die Struktur JOBOBJECT_BASIC_LIMIT_INFORMATION definiert und die LimitFlags auf JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE gesetzt. Dadurch wird sichergestellt, dass, wenn ein Prozess im Jobobjekt beendet wird, auch die anderen Prozesse automatisch beendet werden.
Vollständiges Codebeispiel:
Hier ist das vollständige Codebeispiel, das Folgendes enthält diese Schritte:
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 ) ) } }
Dieser Code erstellt ein Jobobjekt, fügt den aktuellen Prozess und einen weiteren Prozess (angegeben durch myProcess) hinzu Jobobjekt und setzen Sie das Flag JOBOBJECT_LIMIT_KILL_ON_JOB_CLOSE. Wenn dadurch entweder der aktuelle Prozess oder myProcess beendet wird, wird auch der andere Prozess automatisch beendet.
Das obige ist der detaillierte Inhalt vonWie verwende ich CreateJobObject und SetInformationJobObject mit PInvoke in .NET, um die Prozessbeendigung zu verwalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!