有时候我们调试系统时,需要在运行过程中查看某个任务的状态,如一些任务的cpu亲和性。但是我们我们只知道要监控的任务的名字,任务的pid是动态分配的。
下面这个程序就是在c中通过popen()执行一段shell程序以通过任务名字找到对应的PID,然后再根据PID查看任务的cpu亲和性:
#include <string.h>
#include <sys/types.h>
#define __USE_GNU
#include <sched.h>
#include<sys/sysinfo.h>
#include <unistd.h>
#define PS_COMMAND "ps aux | grep %s | grep -v grep| awk \'{print $1}\'"
int getaffinity_by_name(char *name)
{
FILE *fp;
char buf[128]={0}, cmd[64];
pid_t pid;
cpu_set_t cpuset;
int i = 0, num = sysconf(_SC_NPROCESSORS_CONF);
unsigned long long cpumask = 0;
sprintf(cmd, PS_COMMAND, name);
printf(" cmd=[%s]\n", cmd);
if ((fp = popen(cmd, "r")) == NULL)
return -1;
if(!fgets(buf, sizeof(buf), fp))
return -1;
fclose(fp);
pid = strtol(buf, 0, 10);
if (pid != 0) {
cpumask = getaffinity_by_tid(pid);
printf(" %s's cpumask is 0x%llx\n", name, cpumask);
return 0;
} else {
printf(" strtol(%s) invalid\n", buf);
return -1;
}
}
int getaffinity_by_tid(pid_t pid)
{
int i;
cpu_set_t cpuset;
unsigned long long cpumask = 0;
int i = 0, num = sysconf(_SC_NPROCESSORS_CONF);
if (pid != 0) {
CPU_ZERO(&cpuset);
sched_getaffinity(pid, sizeof(cpuset), &cpuset);
for (i = 0; i < num; i++){
if (CPU_ISSET(i, &cpuset))
cpumask |= 1 << i;
}
}
return cpumask;
}
[Click and drag to move]