将CPU亲和性设置为进程 - C - Linux

时间:2013-06-19 15:21:28

标签: c linux

不是最好的C编程,这是我第一次尝试将程序从python移植到C. 致Alnitak以下计划的积分

#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);
}

编译我做了这个..

gcc -D_GNU_SOURCE -o test test.c

但是,当我尝试使用以下脚本返回并检查程序的运行位置时:

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

那里很混乱......这是什么错误?

3 个答案:

答案 0 :(得分:2)

行。 这是人们可以做的最愚蠢的事情!

    CPU_SET(pid, &mask);

    CPU_SET(coreid, &mask);

将pid更改为coreid即可。

另一个错误在于:

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

答案 1 :(得分:0)

你可能正在寻找第39场(从1开始计算)

  

处理器%d(自Linux 2.2.8起)上次执行的CPU编号。

(来自man proc

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

答案 2 :(得分:0)

解析/proc/[pid]/stat文件有点棘手,因为您可以在文件名中包含嵌入的空格和括号。这些以任何方式进行转义。

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

cp /bin/cat ') fake (' && './) fake (' < /proc/self/stat && rm -f ') fake ('

正确的程序是将所有内容(但不包括第一次出现的" ("作为pid(进程ID)。最新但不包括") " last 出现的所有内容都是comm,即进程可执行文件的文件名。 (其他字段都不是字符串类型,因此您不应在文件的其他位置看到任何括号。)以下所有字段均以空格分隔,并在/proc/[pid]/stat下的comm中列出。处理器是Cpus_allowed_list:之后的第37个字段,或整个第39个字段。 (在Ubuntu 3.8.0-25-x86-64上的通用字段中,该字段是从结尾向后计数的第14个,而不是第6个 - 但这可能会发生变化,因为新字段总是可以添加到最后。)

如果您将自己限制在Linux 2.6.26及更高版本(包括所有3.x.y版本及更高版本),那么您只需查看/proc/[pid]/status中的processor行即可。它更容易解析,并告诉内核允许进程运行的内核,而不仅仅是进程上次运行的CPU(/proc/[pid]/stat中的{{1}}字段描述的那个)。

希望这有帮助。