Obtenir EPERM lors de l’appel de pthread_create () pour le thread SCHED_FIFO en tant que racine sous Linux

J’essaie de générer des threads avec les règles SCHED_FIFO ou SCHED_RR en tant que racine sur un système Linux, mais mes appels à pthread_create () renvoient 1 (EPERM). La page de manuel de pthread_create () indique que EPERM indique que “l’appelant ne dispose pas des permissions appropriées pour définir les parameters de planification ou la stratégie de planification requirejs”. Root ne devrait-il pas pouvoir spécifier SCHED_FIFO ou SCHED_RR?

J’ai supprimé le code qui crée un fil dans un petit programme qui ne fait que cela. Cela me semble juste mais j’obtiens toujours l’erreur. Qu’est-ce que je fais mal?

Le programme:

#include  #include  #include  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; } 

Ce programme a été compilé et exécuté en tant que root. Lorsqu’il est exécuté, le programme échoue lors de l’appel de pthread_create, renvoyant EPERM.

Le changement de thread en planification SCHED_RR n’a aucun effet – EPERM est toujours renvoyé par pthread_create.

Le changement du fil en planification SCHED_OTHER et sa priorité à 0 permettent au programme de s’exécuter sans erreur.

Votre limite souple de priorité en temps réel doit être trop ressortingctive.

Appelez ulimit -r unlimited en shell avant d’exécuter votre code. Ou appelez setrlimit(RLIMIT_RTPRIO, ...) directement dans votre code.

Les limites du système sont définies dans /etc/security/limits.conf .

J’ai testé votre code sous Linux (kernel 2.6), Solaris 9 et 10. Pas de problème. Cela concerne vos parameters de priorité en temps réel. Vous pouvez changer cela avec:

 ulimit -r unlimited 

Oops. Maxim est déjà arrivé avec la réponse ….

Exécutez le programme en tant qu’utilisateur root. Parce que nous jouons avec la planification (ses pour FIFO et RR). vous bousillez également (implicitement) avec des priorités relatives, et seul root peut le faire.

Pthread_creare () retourne EPERM normalement, mais en tant qu’utilisateur root, cela fonctionne bien.

Pour plus d’informations, visitez: http://www.linuxforums.org/forum/programming-scripting/111359-pthread-error.html