focal (3) pthread_getschedparam.3.gz

Provided by: manpages-fr-dev_3.65d1p1-1_all bug

NOM

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

SYNOPSIS

       #include <pthread.h>

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

       Compilez et effectuez l'édition des liens avec l'option -pthread.

DESCRIPTION

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

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

       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  supporté.  Veuillez  consulter
       sched_setscheduler(2) 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 policy 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 thread avec pour identifiant thread n'a pu être trouvé.

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

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

       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-2001 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().

CONFORMITÉ

       POSIX.1-2001.

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_setscheduler(2).

EXEMPLE

       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      # Need privilege to set real-time scheduling policies
           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 <pthread.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <errno.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);          /* Shorter */
           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;

           /* Process command-line options */

           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");

           /* Optionally set scheduling attributes of main thread,
              and display the attributes */

           if (main_sched_str != NULL) {
               if (!get_policy(main_sched_str[0], &policy))
                   usage(argv[0], "Bad policy for main thread (-s)\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");

           /* Initialize thread attributes object according to 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");
           }

           /* If we initialized a thread attributes object, display
              the scheduling attributes that were set in the object */

           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);

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

           /* Create a thread that will display its scheduling attributes */

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

           /* Destroy unneeded thread attributes object */

           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), sched_setscheduler(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)

COLOPHON

       Cette page fait partie de la publication 3.65 du projet man-pages Linux. Une description du projet et des
       instructions pour signaler des anomalies peuvent être trouvées à l'adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par
       l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

       Denis Barbier (2010).

       Veuillez signaler toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org> ou par
       un rapport de bogue sur le paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C
       <section> <page_de_man> ».