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