将CPU关联设置为进程-C-Linux

将CPU关联设置为进程-C-Linux,c,linux,C,Linux,这不是C编程中最好的,这是我第一次尝试将程序从python移植到C。 以下课程的学分为 #include<sched.h> void task_set(int pid) { int result; cpu_set_t mask; CPU_ZERO(&mask); CPU_SET(pid, &mask); result = sched_setaffinity(0, sizeof(mask

这不是C编程中最好的,这是我第一次尝试将程序从python移植到C。 以下课程的学分为

#include<sched.h>

void task_set(int pid) {
        int result;
        cpu_set_t  mask;
        CPU_ZERO(&mask);
        CPU_SET(pid, &mask);
        result = sched_setaffinity(0, sizeof(mask), &mask);
        printf ("%d\n",result);
}

void main()
{ //excuse me for the static
task_set(1400);
}
但是,当我尝试返回并使用以下脚本检查程序运行的位置时:

def which_core(pid):
        f = file(os.path.join('/proc', str(fpid), 'stat'), 'rb')
        val = f.read()
        f.close()
        return int(val.split(' ')[-6])
print 'core_id',which_core(1400)
它提供了以下输出:

core_id 32997376
那里很混乱。。。怎么了?

好的。 这是一个人能做的最愚蠢的事

    CPU_SET(pid, &mask);

    CPU_SET(coreid, &mask);
将pid更改为将完成此操作

另一个错误是:

    result = sched_setaffinity(pid, sizeof(mask), &mask);

您可能正在查找字段39(从1开始计算)

上次在上执行的处理器%d(自Linux 2.2.8以来)CPU数

(来自
man proc


(编辑:看起来像-6=39,很抱歉没有注意到:-p)

解析
/proc/[pid]/stat
文件有点棘手,因为文件名中可以嵌入空格和括号。这些都不是以任何方式逃脱的

要查看非常真实的效果,请运行

cp /bin/cat ') fake (' && './) fake (' < /proc/self/stat && rm -f ') fake ('
cp/bin/cat')假('&&&'./)假('
正确的程序是,将所有内容(包括但不包括第一次出现的
”(“
作为
pid
),进程ID。所有内容(包括但不包括最后一次出现的
”)
都是
comm
,进程可执行文件名。(其他字段都不是字符串类型,因此您不应该在文件中的其他位置看到任何括号。)以下所有字段都用空格分隔,并在中列出,位于
/proc/[pid]/stat
下。处理器是
comm
之后的第37个字段,或总共第39个字段。(在x86-64上的Ubuntu 3.8.0-25-generic上,该字段从末尾向后算是第14位,而不是第六位——但这可能会发生变化,因为新字段总是可以添加到末尾。)

如果您将自己限制在Linux 2.6.26及更高版本(包括所有3.x.y及更高版本),那么您可以只查看
/proc/[pid]/status
中的
CPU允许\u列表:
行。它更容易解析,并告诉内核允许进程运行的内核,而不仅仅是进程最后运行的CPU(这是
/proc/[pid]/stat
中的
处理器
字段所描述的)


希望这有帮助。

我的内核版本是
3.7.10-1.11-desktop
。因此该值是正确的。这也是我最初的怀疑。我得到的结果值是
-1
是fpid输入错误吗?它不应该是pid,函数参数吗?是的,这是我犯的错误。
cp /bin/cat ') fake (' && './) fake (' < /proc/self/stat && rm -f ') fake ('