Próbuję odrodzić wątki z zasada SCHED_FIFO lub SCHED_RR jako root w systemie Linux, ale moje wywołania pthread_create() wracają 1 (EPERM). Strona podręcznika dla pthread_create() mówi, że EPERM wskazuje, że "osoba dzwoniąca nie ma odpowiednich uprawnień do ustawiania wymaganych parametrów planowania lub strategii planowania". Czy root nie może określać SCHED_FIFO lub SCHED_RR?Uzyskiwanie EPERM podczas wywoływania pthread_create() dla wątku SCHED_FIFO jako root w systemie Linux
Usunąłem kod, który tworzy wątek do małego programu, który robi tylko to. Wygląda mi dobrze, ale nadal dostaje błąd. Co ja robię źle?
Program:
#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;
}
Program ten został opracowany i uruchomiony jako root. Po uruchomieniu program zawiedzie podczas wywołania pthread_create, zwracając EPERM.
Zmiana wątku na SCHED_RR harmonogramowanie nie ma wpływu - EPERM nadal zwrócony przez pthread_create.
Zmiana wątku na harmonogram SCHED_OTHER i jego priorytet na 0 pozwala na uruchomienie programu bez błędu.
wierzę trzeba 'CAP_SYS_NICE' zestaw zdolność do użytkownika wywołującego. Nie wiem zbyt wiele o tym, jak to działa z 'sudo' itp. Sprawdź' man 7 zdolności'. –
Wygląda na to, że możesz ustawić ładny poziom używając 'ulimit -e' w taki sam sposób, jak ustawienie priorytetu czasu rzeczywistego. Nie dostarczył mi "eureka!" jednak chwilę. – ChrisL
Systemy Linux, których używamy w pracy, to zwirtualizowane serwery. Chwytam tutaj słomki, ale czy to może mieć jakiś wpływ na ustalanie priorytetów w czasie rzeczywistym? – ChrisL