使用P/Invoke 實作CreateJobObject 和SetInformationJobObject 的範例
此範例示範如何建立作業物件(CreateJob資訊(SetInformationJobObject),以確保在作業執行時與作業關聯的程序終止
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 } }
這個擴充範例說明了建立作業物件、設定其基本限制資訊以及向作業物件新增流程的完整實作。 JOBOBJECT_LIMIT_KILL_ON_JOB_CLOSE 標誌確保當作業物件關閉時,與作業關聯的任何進程都會被終止,從而確保進程使用的所有資源都被正確清理。
以上是如何在C#中使用P/Invoke建立和管理作業物件以確保進程終止?的詳細內容。更多資訊請關注PHP中文網其他相關文章!