我可以為一個行程分配一個cpu核心,方法是這樣運行:
在這里,./wait是一個可執行檔案,其代碼如下所示,我試圖將core=21分配給這個行程。 但是,當我試圖從另一個行程(使用execl)做同樣的事情時,它并不作業。例如,下面的代碼執行了行程(沒有報告錯誤),但沒有完成對該行程的核心分配:taskset -c 21 .
taskset -c 21 ./wait xx
//run/thex>
//run as: ./a.out name 21
#include <stdio.h>
#include <unistd.h>
#include <stdarg.h>
int main(int argc, char* argv[] ) {
printf("scheduling
");
int status = execl("taskset", "-c", argv[2], "./wait", argv[1], NULL) 。
if(status<0) perror("Err:")。
}
這里是等待程式的代碼,它只是等待用戶給出一些輸入,這樣我就有時間從另一個終端檢查cpu的狀態:
因此,我的問題是:當運行一個行程時,如何使用execl來分配cpu-core?(BTW,如果行程已經在運行,并且我有它的pid,那么對該pid的任務集的exec將改變該行程的核心分配。只有當它以這里顯示的方式進行時,它才不會起作用。
uj5u.com熱心網友回復: 你錯誤地呼叫了 uj5u.com熱心網友回復: 可能更容易的是分叉行程,然后設定你的CPU親和力
在執行命令之前設定你的CPU親和力可能更容易。
像下面這樣。 Linux: Windows: 代碼實體見于
如何設定行程的CPU親和力.
標籤: 下一篇:箭頭在這個函式中做什么?//run/cpu.htm
//run as: ./wait name
#include <stdio.h>
#include <stdarg.h>
int main(int argc, char* argv[] ) {
printf("%s:要求用戶輸入資訊
", argv[1])。)
int x;
scanf("%d", &x)。
printf("got-%d
", x);
}
execl():第一個引數應該是可執行檔案的完整路徑名。 要么指定完整的路徑,要么使用execlp()(可能是前者,因為你想使用一個特定的taskset程式)。 無論哪種方式,你都需要提供行程名稱作為引數0:int status = execl("/usr/bin/taskset",
"taskset", "-c", argv[2], "./wait", argv[1], NULL)。)
#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <sys/sysinfo.h>
int main()
{
cpu_set_t mask;
CPU_ZERO(&mask)。
CPU_SET(0, &mask)。
CPU_SET(1, &mask);
CPU_SET(2, &mask);
CPU_SET(3, &mask)。
sched_setaffinity(0, sizeof(mask), &mask)。
}
#include <Windows.h>
int main()
{
::SetProcessAffinityMask(GetCurrentProcess(), 0xf/*first 4 cpus*/)。
}
