2013-06-19 41 views
1

不是在C编程最好的,这是我第一次审判端口从Python中的程序C. 贷Alnitak为下面的程序设置CPU亲和力的过程 - C - Linux的

#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 

这是相当混乱......还有什么是错?

+0

那是fpid的一个错字吗?它不应该是PID,函数的参数? –

+0

是的,那是我犯的错误。 – pistal

回答

2

好的。 这是人们能做的最愚蠢的事!

CPU_SET(pid, &mask); 

    CPU_SET(coreid, &mask); 

将pid更改为coreid将执行此操作。

另一个错误是在这里:

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

你可能要找场39(从1开始数)

处理器%d(因为Linux 2.2.8)CPU编号最后执行上。

(从man proc

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

+0

我的内核版本是'3.7.10-1.11-desktop'。所以这个值是正确的。那也是我最初的怀疑。我获得的结果值是'-1' – pistal

0

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

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

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

正确的做法是采取一切直到但不包括" ("第一次出现为pid,进程ID。一切达到但不包括最后") "的发生是comm,该进程的文件名是可执行文件。 (其他字段都不是字符串类型,因此您不应该在文件的其他字段中看到任何括号。)以下所有字段均用空格分隔,并在man 5 proc,/proc/[pid]/stat下列出。处理器是继comm之后的第37个字段,总共为第39个字段。 (在Ubuntu 3.8.0-25-x86-64上通用,该字段从第14位倒数倒数第6位,但随着新字段始终添加到最后,可能会发生变化。)

如果您仅限于Linux 2.6.26及更高版本(包括所有3.xy版本及更高版本),那么您可以仅看行/proc/[pid]/status。它更容易分析,并告诉内核将允许进程运行的核心,而不仅仅是该进程上次运行的哪个CPU(/proc/[pid]/stat中描述的processor字段)。

希望这会有所帮助。