1

我对 .NET 互操作不是很熟悉。我正在尝试使用对 .NET 的调用来实现忽略 .NET 中的 linux 进程信号sigaction

我可以提出的互操作定义如下:

    public delegate void __sighandler_t(int signal);
    public delegate void sa_restorer();

    [StructLayout(LayoutKind.Sequential)]
    public struct __sigset_t
    {
        ulong[] __val; // 1024 / (8 * 8)
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct sigaction
  {
    public __sighandler_t sa_handler;
    /* Additional set of signals to be blocked.  */
    public __sigset_t sa_mask;
    /* Special flags.  */
    public int sa_flags;
    /* Restore handler.  */
    public sa_restorer sa_restorer;
  };

在尝试编写忽略 SIGTERM 的示例实现时,我尝试

var returnCode = NetlinkDemo.sigaction(15, IntPtr.Zero, IntPtr.Zero);
System.Console.WriteLine($"sigaction 1 returned [{returnCode}]");

sigaction act = new sigaction();
act.sa_flags = 0;
act.sa_handler = HandleSignal;

IntPtr actPtr = Marshal.AllocHGlobal(Marshal.SizeOf<sigaction>());
Marshal.StructureToPtr<sigaction>(act, actPtr, true);

returnCode = NetlinkDemo.sigaction(15, actPtr, IntPtr.Zero);
System.Console.WriteLine($"sigaction 2 returned [{returnCode}]");

private static void HandleSignal(int signal)
{
    System.Console.WriteLine($"Handling signal [{signal}]");
}

Marshal.AllocHGlobal这是在:上引发错误System.ArgumentException: Type 'myProject.sigaction' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed

我的互操作定义错了吗?我在做一些没有意义的事情吗?

4

0 回答 0