sched_setaffinity
Mono で実行されている 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_t
UIntPtr
IntPtr
編集:Simon Mourierのコメントに基づいて構築:cpu_set_t *
型から、3番目のパラメーターはポインターでなければならないことを収集します。ref ulong
資格はありますか?マクロの実装が簡単になるので、その型を使用したくなります。たとえば、単一プロセッサのマスクは次のid
ように計算できます。
ulong mask = 1UL << id;
の配列として実装されているcpu_set_t
in thisの定義を見つけました。sched.h
unsigned long int