Csharp/C#教程:当父NT服务被杀/崩溃时杀死子进程分享


当父NT服务被杀/崩溃时杀死子进程

我有一个Windows NT服务和第三方exe,我想作为NT服务的子进程运行,这样一旦我的NT服务进程崩溃,这个子进程也被杀死

为此,我找到了在父进程被终止时使用Kill子进程执行此操作的方法

我试图实现它,并使用普通的父进程正常工作,但当我在我的NT服务中做同样的事情,因为父SetInformationJobObject方法返回false和错误代码0的exception

例外:_COMPlusExceptionCode = -532462766

正常进程和导致此exception的NT服务进程有什么区别?

我正在使用Win2k8 R2 Server机器和C#

[EDIT1]exception:GenericParameterAttributes =’((System.Reflection.RuntimeConstructorInfo)(ex._exceptionMethod))。ReflectedType).GenericParameterAttributes’抛出类型’System.InvalidOperationException’的exception{“”方法只能在类型上调用Type.IsGenericParameter是真的。“}

编辑2:因为在函数定义中使用DLLImport没有将SetLastError设置为true,所以最后一个错误是错误的正确ErrorCode是24表示结构的坏结果,那么应该是什么正确的结构?

编辑3:在我的64位win2k8R2服务器机器的NT Servce的情况下预期的正确长度似乎是144而不是上面的post中定义的112

编辑4:这是否是这样做的唯一方法,做同样的其他选择是什么?

问题在于我使用的结构声明,如父线程被终止时线程杀死子进程中所定义的那样

上述线程中定义的结构对32位应用程序和
我的NT服务是64位应用程序,需要进行一些更改

改变了

 [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 vs UInt32 DWORD = Int32

更改后,它工作正常。

上述就是C#学习教程:当父NT服务被杀/崩溃时杀死子进程分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/951040.html

(0)
上一篇 2021年11月18日
下一篇 2021年11月18日

精彩推荐