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