【发布时间】:2012-02-16 14:52:59
【问题描述】:
我试图在 Linux 系统上以根用户身份使用 SCHED_FIFO 或 SCHED_RR 策略生成线程,但我对 pthread_create() 的调用返回 1 (EPERM)。 pthread_create() 的手册页说 EPERM 表明“[t]他的调用者没有适当的权限来设置所需的调度参数或调度策略。” root 不应该能够指定 SCHED_FIFO 或 SCHED_RR 吗?
我已将创建线程的代码剥离到一个仅执行此操作的小程序中。它在我看来是正确的,但仍然出现错误。我做错了什么?
程序:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
static void *_Thread(void *arg)
{
(void)arg;
printf("Thread running!\n");
return NULL;
}
int main(void)
{
int retVal;
pthread_attr_t attr;
struct sched_param schedParam;
pthread_t thread;
retVal = pthread_attr_init(&attr);
if (retVal)
{
fprintf(stderr, "pthread_attr_init error %d\n", retVal);
exit(1);
}
retVal = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
if (retVal)
{
fprintf(stderr, "pthread_attr_setinheritsched error %d\n", retVal);
exit(1);
}
retVal = pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
if (retVal)
{
fprintf(stderr, "pthread_attr_setschedpolicy error %d\n", retVal);
exit(1);
}
schedParam.sched_priority = 1;
retVal = pthread_attr_setschedparam(&attr, &schedParam);
if (retVal)
{
fprintf(stderr, "pthread_attr_setschedparam error %d\n", retVal);
exit(1);
}
retVal = pthread_create(&thread,
&attr,
_Thread,
NULL);
if (retVal)
{
fprintf(stderr, "pthread_create error %d\n", retVal);
exit(1);
}
retVal = pthread_join(thread, NULL);
if (retVal)
{
fprintf(stderr, "pthread_join error %d\n", retVal);
exit(1);
}
printf("main run successfully\n");
return 0;
}
此程序已编译并以 root 身份运行。运行时,它在调用 pthread_create 时程序失败,返回 EPERM。
将线程更改为 SCHED_RR 调度无效 - pthread_create 仍返回 EPERM。
将线程更改为SCHED_OTHER调度并将其优先级更改为0允许程序无错误地运行。
【问题讨论】:
-
我相信您需要为调用用户设置
CAP_SYS_NICE功能。我不太了解它如何与sudo等一起使用。请查看man 7 capabilities。 -
您可以使用
ulimit -e设置nice 级别,方法与设置实时优先级限制相同。它没有为我提供“尤里卡!”不过,现在还来得及。 -
我们在工作中使用的 Linux 系统是虚拟化服务器。我在这里抓住了救命稻草,但这可能对设置实时优先级有任何影响吗?
-
在 /etc/security/limits.conf 中查找“rtprio”条目。这大概就是问题所在。就这样的事情而言,虚拟服务器通常设置为完全独立的。您是否有完整的本地根文件系统(未继承)?
-
/etc/security/limits.conf 中对“rtprio”的唯一引用是在注释中。我发现有人在笔记本电脑上运行 Linux(Ubuntu),我让他编译并运行上面的程序,它对他有用,所以这与我们的 Linux 服务器有关,导致了这个问题。我会在我们的 IT 人员明天进来时与他核实一下他们的根文件系统的性质。