我需要为Linux sched_setaffinity
函数提供P / Invoke签名,从Mono上运行的C#代码调用。
int sched_setaffinity(pid_t pid, size_t cpusetsize,
cpu_set_t *mask);
" open-hardware-monitor"中的ThreadAffinity
类project将其定义为:
[DllImport(LIBC)]
public static extern int sched_setaffinity(int pid, IntPtr maskSize,
ref ulong mask);
但是,Mono.LibRt项目使用不同的签名:
[DllImport (LIBC, CallingConvention=CallingConvention.Cdecl,
SetLastError=true, EntryPoint="sched_setaffinity")]
protected static extern int sched_setaffinity (long pid, int num_bytes,
byte[] affinity);
两个签名都是正确的,还是一个错误?它们是否可以跨32位和64位架构移植?
我假设第一个参数应该是int
,而不是long
,因为pid_t
是32位和64位平台上的带符号32位整数(per {{ 3}})。同样,第二个应该是UIntPtr
或IntPtr
每Joe Shaw。但是,我不知道如何处理第三个参数。
编辑:以Simon Mourier的评论为基础:我从cpu_set_t *
类型中收集第三个参数应该是指针。 ref ulong
符合资格吗?我很想使用那种类型,因为它使宏更容易实现;例如,单个处理器id
的掩码可以计算为:
ulong mask = 1UL << id;
我在Patrick McDonald中找到了cpu_set_t
的定义,并将其作为unsigned long int
数组实现。
答案 0 :(得分:1)
如您所见,cpu_set_t只是一个unsigned long int数组。所以我会声明这样的函数:
[DllImport("libc.so.6", SetLastError=true)]
private static extern int sched_setaffinity(
int pid,
IntPtr cpusetsize,
ulong[] cpuset
);
答案 1 :(得分:0)
根据我的other answer,我选择了以前的选项(在Linux上运行良好)。
[DllImport("libc.so.6", SetLastError=true)]
private static extern int sched_setaffinity(int pid, IntPtr cpusetsize,
ref ulong cpuset);