2012-02-16 11 views
5

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.

+0

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'. –

+0

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

+0

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

Odpowiedz

4

Musi być tak, że twój miękki limit priorytetu w czasie rzeczywistym jest zbyt ograniczony.

Zadzwoń pod numer ulimit -r unlimited w powłoce przed uruchomieniem kodu. Lub zadzwoń pod numer setrlimit(RLIMIT_RTPRIO, ...) bezpośrednio w kodzie.

Limity dla całego systemu są ustalane w /etc/security/limits.conf.

+0

Wywołanie "ulimit -r" rzeczywiście pokazało, że priorytet priorytetu root w czasie rzeczywistym wynosi 0. Zmieniłem go najpierw za pomocą 'ulimit -r unlimited', a następnie w moim programie z' setrlimit (...) 'ale gdybym mógł sprawdź, czy limit się zmienił, wciąż mam EPERM. – ChrisL

+0

Czy jesteś w specjalnym otoczeniu, może lubisz ARM? Co oznacza uname -a show? –

+0

'uname -a' daje mi' Linux cumanta 2.6.32-042stab044.17 # 1 SMP Fri 13 stycznia 12:53:58 MSK 2012 i686 i686 i386 GNU/Linux'. Maszyna działa w CentOS 6.2. – ChrisL

1

Przetestowałem Twój kod w systemie Linux (jądro 2.6), Solaris 9 & 10. Żadnych problemów. Ma to związek z priorytetowymi ustawieniami w czasie rzeczywistym. Możesz to zmienić za pomocą:

ulimit -r unlimited 

oops. Maxim już tu dostał odpowiedź ...

0

Uruchom program jako użytkownik root. Ponieważ mamy kłopot z planowaniem (jego dla FIFO i RR). ty też psujesz (przez implikację) względne priorytety i tylko root może to zrobić.

Uruchamianie powyżej programu normalnie, pthread_creare() zwraca EPERM, ale jako użytkownik root działa dobrze.

Aby uzyskać więcej informacji na stronie: http://www.linuxforums.org/forum/programming-scripting/111359-pthread-error.html

Powiązane problemy