P / Invoke签名为sched_setscheduler

时间:2013-06-14 22:35:55

标签: c# linux mono pinvoke

我需要为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}})。同样,第二个应该是UIntPtrIntPtrJoe Shaw。但是,我不知道如何处理第三个参数。

编辑:以Simon Mourier的评论为基础:我从cpu_set_t *类型中收集第三个参数应该是指针。 ref ulong符合资格吗?我很想使用那种类型,因为它使宏更容易实现;例如,单个处理器id的掩码可以计算为:

ulong mask = 1UL << id;

我在Patrick McDonald中找到了cpu_set_t的定义,并将其作为unsigned long int数组实现。

2 个答案:

答案 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);