我对 .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
。
我的互操作定义错了吗?我在做一些没有意义的事情吗?