1

不是 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

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

4

3 回答 3

2

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

    CPU_SET(pid, &mask);

    CPU_SET(coreid, &mask);

将 pid 更改为coreid 即可

另一个错误在这里:

    result = sched_setaffinity(pid, sizeof(mask), &mask);
于 2013-06-19T15:24:26.147 回答
0

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

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

(来自man proc

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

于 2013-06-19T15:41:30.280 回答
0

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

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

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

正确的过程是处理所有内容,但不包括" ("as的第一次出现pid,即进程 ID。所有直到但不包括最后出现的") "is comm,进程可执行文件的文件名。(其他字段都不是字符串类型,因此您不应该在文件的其他位置看到任何括号。)以下所有字段都用空格分隔,并列在man 5 proc、 下/proc/[pid]/stat。处理器是后面的第 37 个字段comm,或整体第 39 个字段。(在 x86-64 上的 Ubuntu 3.8.0-25-generic 上,该字段从末尾倒数第 14 位,而不是第六位——但这可能会发生变化,因为总是可以将新字段添加到末尾。)

如果您将自己限制在 Linux 2.6.26 及更高版本(包括所有 3.xy 版本及更高版本),那么您可以只查看该Cpus_allowed_list:/proc/[pid]/status。它更容易解析,并告诉内核将允许进程运行哪些内核,而不仅仅是进程最后一次运行在哪个 CPU 上(该processor字段中/proc/[pid]/stat描述)。

希望这可以帮助。

于 2013-06-19T16:03:19.793 回答