Я пытаюсь порождать потоки с политиками SCHED_FIFO или SCHED_RR от имени root в системе Linux, но мои вызовы pthread_create () возвращают 1 (EPERM).Страница man для 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 не имеет никакого эффекта - EPERM все еще возвращается pthread_create.
Изменение потока на планирование SCHED_OTHER иПриоритет 0 позволяет программе работать без ошибок.