Heim > Backend-Entwicklung > C++ > Wie verwende ich CreateJobObject und SetInformationJobObject mit PInvoke in .NET, um die Prozessbeendigung zu verwalten?

Wie verwende ich CreateJobObject und SetInformationJobObject mit PInvoke in .NET, um die Prozessbeendigung zu verwalten?

DDD
Freigeben: 2024-12-27 13:46:10
Original
597 Leute haben es durchsucht

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

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 );
Nach dem Login kopieren

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 );
Nach dem Login kopieren

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 ) )
Nach dem Login kopieren

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 ) )
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage