0

私は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をキャッチできます(jobesced fatid _bescedのexcect( ")をキャッチすることはできません。

ネイティブプログラムを試してみましたが、JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESSでもキャッチできません。

なぜ?私は間違いを犯しましたか?

4

1 に答える 1

0

JOBOBJECT_ASSOCIATE_COMPLETION_PORTのドキュメントを見ると、プロセスの終了通知が送信される構造体のように見えますが、終了コードの限られたセットのみが異常終了と見なされることがわかります。

たとえば、プロセスを STATUS_ACCESS_VIOLATION で終了させるには、次の C++ プログラムを試して、異常終了通知を受け取るかどうかを確認します。

void main()
{
    int* p = nullptr;
    *p = 42;
}

私のテストでは、未処理の例外で終了する .NET アプリケーションは終了コード 255 を持ちます。これは、異常終了と見なされるものとしてリストされているものの 1 つではありません。

于 2013-11-25T05:46:56.063 に答える