我正在编写一个实用程序来动态更改Android上的任务调度策略。我主要使用sched_getscheduler()和sched_setscheduler()系统调用来完成此任务。
在sched.h(在内核中),调度策略定义为:
/*
* Scheduling policies
*/
#define SCHED_NORMAL 0
#define SCHED_FIFO 1
#define SCHED_RR 2
#define SCHED_BATCH 3
/* SCHED_ISO: reserved but not implemented yet */
#define SCHED_IDLE 5
但是,有些任务(主要是IRQ,尽管不是每个IRQ)在调用sched_getscheduler()时返回-1。
我在sched.c的内核中找到了sched_getscheduler()系统调用的定义:
SYSCALL_DEFINE1(sched_getscheduler, pid_t, pid)
{
struct task_struct *p;
int retval;
if (pid < 0)
return -EINVAL;
retval = -ESRCH;
rcu_read_lock();
p = find_process_by_pid(pid);
if (p) {
retval = security_task_getscheduler(p);
if (!retval)
retval = p->policy
| (p->sched_reset_on_fork ? SCHED_RESET_ON_FORK : 0);
}
rcu_read_unlock();
return retval;
}
ESRCH和EINVAL分别定义为3和22。这让我对sched_getscheduler()返回-1的方式感到茫然。
感兴趣的人的一些背景信息。我在第一代Nexus 7上使用Android 4.4.2上的Linux Kernel 3.1.10。返回-1的IRQ具体为:210-host_sp,214-host_sp和218-host_sp。我知道这些IRQ与图形驱动程序有关,但也可能有其他我没有注意到的。
非常感谢任何见解。
由于
答案 0 :(得分:0)
与大多数其他用户空间函数一样,sched_getscheduler
返回-1表示错误。
要获取实际的错误代码,请参阅errno
。