Heim >Backend-Entwicklung >C++ >Wie verwende ich P/Invoke zum Erstellen und Verwalten von Jobobjekten in C#, um die Beendigung des Prozesses sicherzustellen?

Wie verwende ich P/Invoke zum Erstellen und Verwalten von Jobobjekten in C#, um die Beendigung des Prozesses sicherzustellen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-04 01:54:38750Durchsuche

How to Use P/Invoke to Create and Manage Job Objects in C# to Ensure Process Termination?

Beispielimplementierung von CreateJobObject und SetInformationJobObject mit P/Invoke

Dieses Beispiel zeigt, wie ein Jobobjekt (CreateJobObject) erstellt und seine Basis festgelegt wird Begrenzen Sie Informationen (SetInformationJobObject), um sicherzustellen, dass mit dem Job verknüpfte Prozesse beendet werden, wenn der Job abgeschlossen ist geschlossen.

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

namespace JobObjectPInvoke
{
    class Program
    {
        const int JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x2000;

        [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
        static extern IntPtr CreateJobObject(IntPtr a, string lpName);

        [DllImport("kernel32.dll")]
        static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, UInt32 cbJobObjectInfoLength);

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool CloseHandle(IntPtr hObject);

        static void Main()
        {
            // Get a handle to the current process.
            IntPtr currentProcessHandle = Process.GetCurrentProcess().Handle;

            // Create a job object.
            IntPtr jobObjectHandle = CreateJobObject(IntPtr.Zero, null);
            if (jobObjectHandle == IntPtr.Zero)
            {
                throw new Exception($"Failed to create job object: {Marshal.GetLastWin32Error()}");
            }

            // Set the limit information for the job object.
            JOBOBJECT_BASIC_LIMIT_INFORMATION jobLimitInfo = new JOBOBJECT_BASIC_LIMIT_INFORMATION
            {
                LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
            };

            int sizeOfJobLimitInfo = Marshal.SizeOf(jobLimitInfo);
            IntPtr ptrJobLimitInfo = Marshal.AllocHGlobal(sizeOfJobLimitInfo);
            Marshal.StructureToPtr(jobLimitInfo, ptrJobLimitInfo, false);

            if (!SetInformationJobObject(jobObjectHandle, JobObjectInfoType.BasicLimitInformation, ptrJobLimitInfo, (uint)sizeOfJobLimitInfo))
            {
                throw new Exception($"Failed to set job limit information: {Marshal.GetLastWin32Error()}");
            }

            // Add the current process to the job object.
            if (!AssignProcessToJobObject(jobObjectHandle, currentProcessHandle))
            {
                throw new Exception($"Failed to add process to job object: {Marshal.GetLastWin32Error()}");
            }

            // Sleep for 10 seconds.
            System.Threading.Thread.Sleep(10000);

            // Close the job object.
            CloseHandle(jobObjectHandle);

            // The current process will terminate when the job object is closed. You can use this example to create a sandbox environment for your processes.
        }

        #region Helper Classes

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

        public enum JobObjectInfoType
        {
            AssociateCompletionPortInformation = 7,
            BasicLimitInformation = 2,
            BasicUIRestrictions = 4,
            EndOfJobTimeInformation = 6,
            ExtendedLimitInformation = 9,
            SecurityLimitInformation = 5
        }

        #endregion
    }
}

Dieses erweiterte Beispiel veranschaulicht eine vollständige Implementierung der Erstellung eines Jobobjekts, der Festlegung seiner grundlegenden Grenzwertinformationen und des Hinzufügens eines Prozesses zum Jobobjekt. Das Flag JOBOBJECT_LIMIT_KILL_ON_JOB_CLOSE stellt sicher, dass alle mit dem Job verbundenen Prozesse beendet werden, wenn das Jobobjekt geschlossen wird, und stellt so sicher, dass alle von den Prozessen verwendeten Ressourcen ordnungsgemäß bereinigt werden.

Das obige ist der detaillierte Inhalt vonWie verwende ich P/Invoke zum Erstellen und Verwalten von Jobobjekten in C#, um die Beendigung des Prozesses sicherzustellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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