2013-06-19 87 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字段)。

希望這會有所幫助。