当父NT服务被终止/崩溃时,终止子进程
Kill Child Process when Parent NT Service is Killed/Crashed
我有一个Windows NT服务和一个第三方exe,我想作为NT服务的子进程运行,这样,一旦我的NT服务进程崩溃,这个子进程也会被杀死
为此,我找到了使用当父进程终止时终止子进程
我尝试实现它,并使用正常的父进程正常工作,但当我在NT服务中执行与父SetInformationJobObject方法相同的操作时,返回false和异常,错误代码为0
异常:_COMPlusExceptionCode=-532462766
导致此异常的正常进程和NT服务进程之间的区别是什么?
我使用的是Win2k8 R2服务器和C#
[编辑1]异常:GenericParameterAttributes="((System.Reflection.RuntimeConstructorInfo)(例如_exceptionMethod)).ReflectedType).GenericParameterAttributes"引发了类型为"System.InvalidOperationException"的异常{"方法只能在Type.IsGenericParameter为true的类型上调用。"}
编辑2:因为在使用DLLImport的函数定义中,SetLastError未设置为true,所以上一个错误是错误的正确的错误代码是24,表示结构的长度不好,那么正确的结构应该是什么?
编辑3:在我的64位win2k8R2服务器机器的NT Servce的情况下,正确的长度预期为144,而在上面的后定义为112
编辑4:这是唯一的方法吗?还有其他选择吗?
问题出现在我使用的结构声明中,如线程中所定义的,当父进程被杀死时,杀死子进程
上面线程中定义的结构对32位应用程序有效,并且
我的NT服务是一个64位的应用程序,它需要对进行一些更改
所做的更改
-
首先将SetInformationJobObject的DLL导入更改为
[DllImport("kernel32.dll", SetLastError = true)] static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, uint cbJobObjectInfoLength);
由于没有设置SetLastError标志,它没有给我正确的错误代码,在得到正确的错误码后,只有我能够得到它期望144字节长度的结构
- 然后将JOBOBJECT_BASIC_LIMIT_INFORMATION和JOBOBJECT_EXTENDED_LIMIT_INFORMATION结构更改为
[StructLayout(LayoutKind.Sequential)]
struct JOBOBJECT_BASIC_LIMIT_INFORMATION
{
public Int64 PerProcessUserTimeLimit;
public Int64 PerJobUserTimeLimit;
public Int32 LimitFlags;
public UInt64 MinimumWorkingSetSize;
public UInt64 MaximumWorkingSetSize;
public Int32 ActiveProcessLimit;
public Int64 Affinity;
public Int32 PriorityClass;
public Int32 SchedulingClass;
}
[StructLayout(LayoutKind.Sequential)]
struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION
{
public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
public IO_COUNTERS IoInfo;
public UInt64 ProcessMemoryLimit;
public UInt64 JobMemoryLimit;
public UInt64 PeakProcessMemoryUsed;
public UInt64 PeakJobMemoryUsed;
}
基本按照JOBOBJECT_EXTENDED_LIMIT_INFORMATION结构和JOBOBJECT_BASIC_LIMIT_INFORMATION结构,我们应该根据应用程序使用数据类型SIZE_T=UInt64与UInt32DWORD=Int32
经过这些改变,一切都很好。
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- ZMQ::send() 抛出异常并终止 QNX 进程.为什么以及如何从中恢复?
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 检测到由于操作系统内存不足而导致子进程终止
- 使用信号检测子进程何时终止的最佳方法是什么?
- 无法检测子进程是否已终止
- 我无法使用终止进程杀死子进程
- 子进程在 fork 中 3 秒后自行终止
- 截获非终止子进程C++的stdout
- 当父NT服务被终止/崩溃时,终止子进程
- Fork进程:在子进程终止时恢复父进程(Linux)
- 在所有子进程终止后,不能运行父进程
- Dup2()导致子进程提前终止
- 从Python子进程终止时的c++调用函数
- CreateProcess,使子进程在父进程被终止时被终止
- 何时应该终止MPI子进程
- 杀死父进程时终止所有子进程