我通过c#
创建一份工作 public WindowsJob()
{
m_handle = Kernel32Dll.CreateJobObject(IntPtr.Zero, null);
SetJobInformation();
SetJobCompletionPort();
}
private void SetJobInformation()
{
var info = new Win32Define.JOBOBJECT_BASIC_LIMIT_INFORMATION
{
LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE,
};
var extendedInfo = new Win32Define.JOBOBJECT_EXTENDED_LIMIT_INFORMATION
{
BasicLimitInformation = info
};
int length = Marshal.SizeOf(typeof(Win32Define.JOBOBJECT_EXTENDED_LIMIT_INFORMATION));
IntPtr extendedInfoPtr = Marshal.AllocHGlobal(length);
Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false);
if (!Kernel32Dll.SetInformationJobObject(m_handle
, Win32Define.JobObjectInfoType.JobObjectExtendedLimitInformation
, extendedInfoPtr, (uint)length))
throw new Exception(string.Format("Unable to set information. Error: {0}", Marshal.GetLastWin32Error()));
}
我可以抓住JOB_OBJECT_MSG_NEW_PROCESS,JOB_OBJECT_MSG_EXIT_PROCESS,JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO,但我无法抓住JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS (我写了一个c#程序,它抛出新的System.Exception(“未处理”)来自杀,它被JOB_OBJECT_MSG_EXIT_PROCESS捕获而不是JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS)。
我尝试了本机程序,它也无法被JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS捕获。
为什么呢?在那里我犯了什么错误?
答案 0 :(得分:0)
如果我们查看JOBOBJECT_ASSOCIATE_COMPLETION_PORT的文档,它看起来是发送进程退出通知的结构,我们发现只有一组有限的退出代码被视为异常退出。
例如,要使用STATUS_ACCESS_VIOLATION退出进程,请尝试以下C ++程序,看看是否收到异常退出通知。
void main()
{
int* p = nullptr;
*p = 42;
}
在我的测试中,以未处理的异常退出的.NET应用程序具有退出代码255,这不是被列为异常退出的那些代码之一。