Написать DEMO программу для работы с CreateJobObject/ JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE - C#
Формулировка задачи:
Нужно написать программу, которая демонстрирует работу CreateJobObject/ JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE .
И программа должна запускать калькулятор,если убить процесс нашей программы (с диспетчера например), то дочерный процесс тоже должен закрыватся.
пс. пример должен быть простым и понятным, чтобы такие как я, не мучались..
в этой теме Пример работы с JobObject тоже пытались сделать, что то подобное, но у меня c этим примером не закрывается калькулятор.
И с этими примерами, тоже ничего не получается у меня:
https://searchcode.com/codesearch/view/28089595/
https://code.google.com/p/managed-lz...Process.cs?r=3
http://stackoverflow.com/questions/6...pinvoke-in-net
Не кидать камнями..
Спасибо!
Решение задачи: «Написать DEMO программу для работы с CreateJobObject/ JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE»
textual
Листинг программы
using System; using System.ComponentModel; using System.Diagnostics; using System.Runtime.InteropServices; namespace JobKillProcess { class Program { #region ~ Platform Invoke ~ #region ~ Enums ~ private enum JobObjectInfoClass { JobObjectExtendedLimitInformation = 9, } [Flags] private enum LimitFlags { JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x00002000, } #endregion #region ~ Structures ~ /// <summary> /// [url]https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms684147%28v=vs.85%29.aspx[/url] /// </summary> private struct JOBOBJECT_BASIC_LIMIT_INFORMATION { internal long PerProcessUserTimeLimit; internal long PerJobUserTimeLimit; internal LimitFlags LimitFlags; internal IntPtr MinimumWorkingSetSize; internal IntPtr MaximumWorkingSetSize; internal uint ActiveProcessLimit; internal UIntPtr Affinity; internal uint PriorityClass; internal uint SchedulingClass; } /// <summary> /// [url]https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms684125%28v=vs.85%29.aspx[/url] /// </summary> private struct IO_COUNTERS { internal ulong ReadOperationCount; internal ulong WriteOperationCount; internal ulong OtherOperationCount; internal ulong ReadTransferCount; internal ulong WriteTransferCount; internal ulong OtherTransferCount; } /// <summary> /// [url]https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms684156%28v=vs.85%29.aspx[/url] /// </summary> private struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION { internal JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; internal IO_COUNTERS IoInfo; internal IntPtr ProcessMemoryLimit; internal IntPtr JobMemoryLimit; internal IntPtr PeakProcessMemoryUsed; internal IntPtr PeakJobMemoryUsed; } /// <summary> /// [url]https://msdn.microsoft.com/en-us/library/windows/desktop/ms686331%28v=vs.85%29.aspx[/url] /// </summary> private struct STARTUPINFO { internal int cb; internal IntPtr lpReserved; // Используем IntPtr взамен string, чтобы избежать ненужного преобразования данных internal IntPtr lpDesktop; // Используем IntPtr взамен string, чтобы избежать ненужного преобразования данных internal IntPtr lpTitle; // Используем IntPtr взамен string, чтобы избежать ненужного преобразования данных internal int dwX; internal int dwY; internal int dwXSize; internal int dwYSize; internal int dwXCountChars; internal int dwYCountChars; internal uint dwFillAttribute; internal uint dwFlags; internal ushort wShowWindow; internal ushort cbReserved2; internal IntPtr lpReserved2; internal IntPtr hStdInput; internal IntPtr hStdOutput; internal IntPtr hStdError; } /// <summary> /// [url]https://msdn.microsoft.com/en-us/library/windows/desktop/ms684873%28v=vs.85%29.aspx[/url] /// </summary> private struct PROCESS_INFORMATION { internal IntPtr hProcess; internal IntPtr hThread; internal int dwProcessId; internal int dwThreadId; } #endregion #region ~ Kernel32 functions ~ private const string Kernel32Lib = "kernel32.dll"; /// <summary> /// [url]https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682409%28v=vs.85%29.aspx[/url] /// </summary> /// <param name="lpJobAttributes"></param> /// <param name="lpName"></param> /// <returns></returns> [DllImport(Kernel32Lib, SetLastError = true, CharSet = CharSet.Unicode)] private static extern IntPtr CreateJobObject( IntPtr lpJobAttributes, string lpName ); /// <summary> /// [url]https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms681949%28v=vs.85%29.aspx[/url] /// </summary> /// <param name="hJob"></param> /// <param name="hProcess"></param> /// <returns></returns> [DllImport(Kernel32Lib, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool AssignProcessToJobObject( IntPtr hJob, IntPtr hProcess ); /// <summary> /// [url]https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms686216%28v=vs.85%29.aspx[/url] /// </summary> /// <param name="hJob"></param> /// <param name="JobObjectInfoClass"></param> /// <param name="lpJobObjectInfo"></param> /// <param name="cbJobObjectInfoLength"></param> /// <returns></returns> [DllImport(Kernel32Lib, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool SetInformationJobObject( IntPtr hJob, JobObjectInfoClass JobObjectInfoClass, // Используем ExtendedLimitInformation, т.к. того требует JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE ref JOBOBJECT_EXTENDED_LIMIT_INFORMATION lpJobObjectInfo, int cbJobObjectInfoLength ); /// <summary> /// [url]https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx[/url] /// </summary> /// <param name="lpApplicationName"></param> /// <param name="lpCommandLine"></param> /// <param name="lpProcessAttributes"></param> /// <param name="lpThreadAttributes"></param> /// <param name="bInheritHandles"></param> /// <param name="dwCreationFlags"></param> /// <param name="lpEnvironment"></param> /// <param name="lpCurrentDirectory"></param> /// <param name="lpStartupInfo"></param> /// <param name="lpProcessInformation"></param> /// <returns></returns> [DllImport(Kernel32Lib, SetLastError = true, CharSet = CharSet.Unicode)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool CreateProcess( string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandles, uint dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation ); /// <summary> /// [url]https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms724211%28v=vs.85%29.aspx[/url] /// </summary> /// <param name="hObject"></param> /// <returns></returns> [DllImport(Kernel32Lib, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool CloseHandle( IntPtr hObject ); #endregion #endregion static void Main() { // Флаг показывающий что процесс создан успешно var processCreated = false; var pi = default(PROCESS_INFORMATION); var hJob = IntPtr.Zero; try { // Создаём процесс калькулятора var si = new STARTUPINFO(); // cb - обязательное поле, отвечает за размер передаваемой структуры si.cb = Marshal.SizeOf(si); bool result = CreateProcess( null, "calc.exe", IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, null, ref si, out pi); if (!result) // Ничего не передаём, исключение должно само корректно получить номер ошибки (Marshal.GetLastWin32Error) throw new Win32Exception(); processCreated = true; // Создаём безымянную работу с дефолтными настройками безопасности hJob = CreateJobObject(IntPtr.Zero, null); if (hJob == IntPtr.Zero) throw new Win32Exception(); // Задаём ограничения для работы var limitInfo = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION(); limitInfo.BasicLimitInformation.LimitFlags = LimitFlags.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; result = SetInformationJobObject( hJob, JobObjectInfoClass.JobObjectExtendedLimitInformation, ref limitInfo, Marshal.SizeOf(limitInfo)); if (!result) throw new Win32Exception(); // Привязываем процесс калькулятора к работе if (!AssignProcessToJobObject(hJob, pi.hProcess)) throw new Win32Exception(); Console.WriteLine("Enter any key to exit..."); Console.ReadKey(); } catch (Win32Exception ex) { Console.WriteLine("Error: {0} (code: {1})", ex.Message, ex.ErrorCode); Console.ReadKey(); } finally { // Закрываем предоставленные системой ресусры: дескрипторы потока и процесса if (processCreated) { CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } // Завершаем работу корректно if (hJob != IntPtr.Zero) CloseHandle(hJob); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д