Provided by: manpages-fr-dev_4.21.0-2_all bug

NOM

       pthread_setschedparam,  pthread_getschedparam  —  Définir  ou  obtenir  la  politique  et  les paramètres
       d'ordonnancement d'un thread

BIBLIOTHÈQUE

       Bibliothèque de threads POSIX (libpthread, -lpthread)

SYNOPSIS

       #include <pthread.h>

       int pthread_setschedparam(pthread_t thread, int politique,
                                 const struct sched_param *param);
       int pthread_getschedparam(pthread_t thread, int *restrict politique,
                                 struct sched_param *restrict param);

DESCRIPTION

       La fonction pthread_setschedparam() définit la politique et les  paramètres  d'ordonnancement  du  thread
       thread.

       L'argument politique spécifie la politique d'ordonnancement pour thread. Les valeurs possibles, ainsi que
       leur signification, sont décrites dans sched(7).

       La structure vers laquelle pointe param spécifie les nouveaux paramètres  d'ordonnancement  pour  thread.
       Les paramètres d'ordonnancement sont gérés dans la structure suivante :

           struct sched_param {
               int sched_priority;     /* Priorité d'ordonnancement */
           };

       Comme on peut le voir, un seul paramètre d'ordonnancement est pris en charge. Veuillez consulter sched(7)
       pour plus de détails sur les valeurs possibles des  priorités  d'ordonnancement  en  fonction  de  chaque
       politique d'ordonnancement.

       La   fonction  pthread_getschedparam()  renvoie,  dans  les  tampons  pointés  par  politique  et  param,
       respectivement la politique et les paramètres d'ordonnancement du thread thread. La  valeur  de  priorité
       renvoyée   est   celle   utilisée   lors   de   l'appel   le   plus   récent  à  pthread_setschedparam(),
       pthread_setschedprio(3) ou pthread_create(3)  qui touchait thread. La priorité renvoyée  ne  reflète  pas
       des  ajustements  de  priorité  temporaires  qui  peuvent  résulter  d'appels  à une fonction qui modifie
       l'héritage     ou     plafonne     la     priorité     d'ordonnancement     (voir,      par      exemple,
       pthread_mutexattr_setprioceiling(3)  et pthread_mutexattr_setprotocol(3)).

VALEUR RENVOYÉE

       En  cas  de réussite, ces fonctions renvoient 0 ; en cas d'erreur, elles renvoient un numéro d'erreur non
       nul. Si pthread_setschedparam() échoue, la politique et les paramètres d'ordonnancement du thread ne sont
       pas modifiés.

ERREURS

       Ces deux fonctions peuvent échouer avec l'erreur suivante :

       ESRCH  Aucun fil d’exécution avec pour identifiant thread n'a pu être trouvé.

       pthread_setschedparam() peut également échouer avec les erreurs suivantes :

       EINVAL politique  n'est  pas  une  politique  reconnue,  ou  param  n'a  pas de sens pour cette valeur de
              politique.

       EPERM  L'appelant n'a pas  les  privilèges  suffisants  pour  définir  la  politique  et  les  paramètres
              d'ordonnancement indiqués.

       POSIX.1  documente également une erreur ENOTSUP (tentative de définition de la politique ou de paramètres
       d'ordonnancement à une valeur non prise en charge) pour pthread_setschedparam().

ATTRIBUTS

       Pour une explication des termes utilisés dans cette section, consulter attributes(7).

       ┌───────────────────────────────────────────────────────────────────────┬──────────────────────┬─────────┐
       │InterfaceAttributValeur  │
       ├───────────────────────────────────────────────────────────────────────┼──────────────────────┼─────────┤
       │pthread_setschedparam(), pthread_getschedparam()                       │ Sécurité des threads │ MT-Safe │
       └───────────────────────────────────────────────────────────────────────┴──────────────────────┴─────────┘

STANDARDS

       POSIX.1-2001, POSIX.1-2008.

NOTES

       Pour  une  description  des  permissions  nécessaires  pour  modifier  la  politique   et   la   priorité
       d'ordonnancement  d'un thread (et leur effet), et les détails sur les valeurs possibles de priorités pour
       chacune des politiques d'ordonnancement, consultez sched(7).

EXEMPLES

       Le programme ci-dessous montre l'utilisation de pthread_setschedparam() et pthread_getschedparam(), ainsi
       que d'un certain nombre d'autres fonctions de pthreads relatives à l'ordonnancement.

       Lors de l'exécution suivante, le thread principal définit sa politique d'ordonnancement à SCHED_FIFO avec
       une priorité de 10  et  initialise  un  objet  d'attributs  de  thread  avec  un  attribut  de  politique
       d'ordonnancement  mis  à SCHED_RR et un attribut de priorité d'ordonnancement de 20. Le programme appelle
       alors pthread_attr_setinheritsched(3) pour définir  à  PTHREAD_EXPLICIT_SCHED  l'attribut  d'héritage  de
       l'ordonnancement  de l'objets d'attributs de thread, ce qui signifie que les threads créés avec cet objet
       d'attributs prendront les attributs d'ordonnancement dans l'objet d'attributs  de  thread.  Le  programme
       crée  alors un thread en utilisant l'objets d'attributs de thread et ce thread affiche sa politique et sa
       priorité d'ordonnancement.

           $ su      # Privilège requis pour définir les politiques
                        # d'ordonnancement en temps réel
           Password:
           # ./a.out -mf10 -ar20 -i e
           Scheduler settings of main thread
               policy=SCHED_FIFO, priority=10

           Scheduler settings in 'attr'
               policy=SCHED_RR, priority=20
               inheritsched is EXPLICIT

           Scheduler attributes of new thread
               policy=SCHED_RR, priority=20

       Nous pouvons voir dans l'affichage ci-dessus que les politique  et  priorité  d'ordonnancement  ont  pris
       comme valeurs celles de l'objets d'attributs de thread.

       L'exécution   suivante  est  identique,  sauf  que  l'attribut  d'héritage  d'ordonnancement  est  mis  à
       PTHREAD_INHERIT_SCHED, ce qui signifie que les threads créés avec cet objet d'attributs  devront  ignorer
       les  attributs  d'ordonnancement  de  l'objets  d'attributs  de  thread et prendre à la place les valeurs
       héritées du thread appelant.

           # ./a.out -mf10 -ar20 -i i
           Scheduler settings of main thread
               policy=SCHED_FIFO, priority=10

           Scheduler settings in 'attr'
               policy=SCHED_RR, priority=20
               inheritsched is INHERIT

           Scheduler attributes of new thread
               policy=SCHED_FIFO, priority=10

       Nous pouvons voir dans l'affichage ci-dessus que les politique  et  priorité  d'ordonnancement  ont  pris
       comme valeurs celles du thread appelant et non de l'objets d'attributs de thread.

       Veuillez  noter  que  si  l'option  -i  i n'avait pas été présente, l'affichage aurait été identique, car
       PTHREAD_INHERIT_SCHED est la valeur par défaut pour l'attribut d'héritage d'ordonnancement.

   Source du programme

       /* pthreads_sched_test.c */

       #include <errno.h>
       #include <pthread.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>

       #define handle_error_en(en, msg) \
               do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)

       static void
       usage(char *prog_name, char *msg)
       {
           if (msg != NULL)
               fputs(msg, stderr);

           fprintf(stderr, "Usage: %s [options]\n", prog_name);
           fprintf(stderr, "Options are:\n");
       #define fpe(msg) fprintf(stderr, "\t%s", msg);          /* Plus court */
           fpe("-a<policy><prio> Set scheduling policy and priority in\n");
           fpe("                 thread attributes object\n");
           fpe("                 <policy> can be\n");
           fpe("                     f  SCHED_FIFO\n");
           fpe("                     r  SCHED_RR\n");
           fpe("                     o  SCHED_OTHER\n");
           fpe("-A               Use default thread attributes object\n");
           fpe("-i {e|s}         Set inherit scheduler attribute to\n");
           fpe("                 'explicit' or 'inherit'\n");
           fpe("-m<policy><prio> Set scheduling policy and priority on\n");
           fpe("                 main thread before pthread_create() call\n");
           exit(EXIT_FAILURE);
       }

       static int
       get_policy(char p, int *policy)
       {
           switch (p) {
           case 'f': *policy = SCHED_FIFO;     return 1;
           case 'r': *policy = SCHED_RR;       return 1;
           case 'o': *policy = SCHED_OTHER;    return 1;
           default:  return 0;
           }
       }

       static void
       display_sched_attr(int policy, struct sched_param *param)
       {
           printf("    policy=%s, priority=%d\n",
                  (policy == SCHED_FIFO)  ? "SCHED_FIFO" :
                  (policy == SCHED_RR)    ? "SCHED_RR" :
                  (policy == SCHED_OTHER) ? "SCHED_OTHER" :
                  "???",
                  param->sched_priority);
       }

       static void
       display_thread_sched_attr(char *msg)
       {
           int policy, s;
           struct sched_param param;

           s = pthread_getschedparam(pthread_self(), &policy, &param);
           if (s != 0)
               handle_error_en(s, "pthread_getschedparam");

           printf("%s\n", msg);
           display_sched_attr(policy, &param);
       }

       static void *
       thread_start(void *arg)
       {
           display_thread_sched_attr("Scheduler attributes of new thread");

           return NULL;
       }

       int
       main(int argc, char *argv[])
       {
           int s, opt, inheritsched, use_null_attrib, policy;
           pthread_t thread;
           pthread_attr_t attr;
           pthread_attr_t *attrp;
           char *attr_sched_str, *main_sched_str, *inheritsched_str;
           struct sched_param param;

           /* Traiter les options en ligne de commande. */

           use_null_attrib = 0;
           attr_sched_str = NULL;
           main_sched_str = NULL;
           inheritsched_str = NULL;

           while ((opt = getopt(argc, argv, "a:Ai:m:")) != -1) {
               switch (opt) {
               case 'a': attr_sched_str = optarg;      break;
               case 'A': use_null_attrib = 1;          break;
               case 'i': inheritsched_str = optarg;    break;
               case 'm': main_sched_str = optarg;      break;
               default:  usage(argv[0], "Unrecognized option\n");
               }
           }

           if (use_null_attrib
               && (inheritsched_str != NULL || attr_sched_str != NULL))
           {
               usage(argv[0], "Can't specify -A with -i or -a\n");
           }

           /* Définir de façon optionelle les attributs d'ordonnancement
              du thread principal et afficher les attributs. */

           if (main_sched_str != NULL) {
               if (!get_policy(main_sched_str[0], &policy))
                   usage(argv[0], "Bad policy for main thread (-m)\n");
               param.sched_priority = strtol(&main_sched_str[1], NULL, 0);

               s = pthread_setschedparam(pthread_self(), policy, &param);
               if (s != 0)
                   handle_error_en(s, "pthread_setschedparam");
           }

           display_thread_sched_attr("Scheduler settings of main thread");
           printf("\n");

          /* Initialiser l'objet d'attributs du thread en fonction des options. */

           attrp = NULL;

           if (!use_null_attrib) {
               s = pthread_attr_init(&attr);
               if (s != 0)
                   handle_error_en(s, "pthread_attr_init");
               attrp = &attr;
           }

           if (inheritsched_str != NULL) {
               if (inheritsched_str[0] == 'e')
                   inheritsched = PTHREAD_EXPLICIT_SCHED;
               else if (inheritsched_str[0] == 'i')
                   inheritsched = PTHREAD_INHERIT_SCHED;
               else
                   usage(argv[0], "Value for -i must be 'e' or 'i'\n");

               s = pthread_attr_setinheritsched(&attr, inheritsched);
               if (s != 0)
                   handle_error_en(s, "pthread_attr_setinheritsched");
           }

           if (attr_sched_str != NULL) {
               if (!get_policy(attr_sched_str[0], &policy))
                   usage(argv[0], "Bad policy for 'attr' (-a)\n");
               param.sched_priority = strtol(&attr_sched_str[1], NULL, 0);

               s = pthread_attr_setschedpolicy(&attr, policy);
               if (s != 0)
                   handle_error_en(s, "pthread_attr_setschedpolicy");
               s = pthread_attr_setschedparam(&attr, &param);
               if (s != 0)
                   handle_error_en(s, "pthread_attr_setschedparam");
           }

           /* Si un objet d'attributs de thread est initialisé, afficher
              les attributs d'ordonnancement définis dans l'objet. */

           if (attrp != NULL) {
               s = pthread_attr_getschedparam(&attr, &param);
               if (s != 0)
                   handle_error_en(s, "pthread_attr_getschedparam");
               s = pthread_attr_getschedpolicy(&attr, &policy);
               if (s != 0)
                   handle_error_en(s, "pthread_attr_getschedpolicy");

               printf("Scheduler settings in 'attr'\n");
               display_sched_attr(policy, &param);

               pthread_attr_getinheritsched(&attr, &inheritsched);
               printf("    inheritsched is %s\n",
                      (inheritsched == PTHREAD_INHERIT_SCHED)  ? "INHERIT" :
                      (inheritsched == PTHREAD_EXPLICIT_SCHED) ? "EXPLICIT" :
                      "???");
               printf("\n");
           }

           /* Créer un thread qui affichera ses attributs d'ordonnancement. */

           s = pthread_create(&thread, attrp, &thread_start, NULL);
           if (s != 0)
               handle_error_en(s, "pthread_create");

           /* Supprimer l'objet d'attributs de thread inutile. */

           if (!use_null_attrib) {
             s = pthread_attr_destroy(&attr);
             if (s != 0)
                 handle_error_en(s, "pthread_attr_destroy");
           }

           s = pthread_join(thread, NULL);
           if (s != 0)
               handle_error_en(s, "pthread_join");

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       getrlimit(2), sched_get_priority_min(2), pthread_attr_init(3), pthread_attr_setinheritsched(3),
       pthread_attr_setschedparam(3), pthread_attr_setschedpolicy(3), pthread_create(3), pthread_self(3),
       pthread_setschedprio(3), pthreads(7), sched(7)

TRADUCTION

       La traduction française de cette page de manuel a été créée par Christophe Blaess
       <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud
       <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard
       <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau
       <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François
       <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard
       <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot
       <david@tilapin.org>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Pierre Giraud <jean-
       pierregiraud@neuf.fr>

       Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License
       version 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ concernant les conditions de copie et de
       distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à
       ⟨debian-l10n-french@lists.debian.org⟩.