1

sched_setaffinityMono で実行されている C# コードから呼び出されるLinux 関数の P/Invoke シグネチャを考え出す必要があります。

int sched_setaffinity(pid_t pid, size_t cpusetsize,
                      cpu_set_t *mask);

ThreadAffinity「open-hardware-monitor」プロジェクトのクラスでは、次のように定義されています。

[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 ビットのアーキテクチャ間で移植可能ですか?

は 32 ビット プラットフォームと 64 ビット プラットフォームの両方で符号付き 32 ビット整数であるため ( Joe Shawintによる)、最初の引数はではなくlongであるべきだと思います。同様に、2 番目は、またはper Patrick McDonaldである必要があります。ただし、3 番目のパラメーターの処理方法がわかりません。pid_tUIntPtrIntPtr

編集:Simon Mourierのコメントに基づいて構築:cpu_set_t *型から、3番目のパラメーターはポインターでなければならないことを収集します。ref ulong資格はありますか?マクロの実装が簡単になるので、その型を使用したくなります。たとえば、単一プロセッサのマスクは次のidように計算できます。

ulong mask = 1UL << id;

の配列として実装されているcpu_set_tin thisの定義を見つけました。sched.hunsigned long int

4

2 に答える 2

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
);
于 2014-01-18T16:38:15.723 に答える