.\" -*- coding: UTF-8 -*- .\" Copyright (c) 2008 Linux Foundation, written by Michael Kerrisk .\" .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH PTHREAD_SETSCHEDPARAM 3 "9 июня 2020 г." Linux "Руководство программиста Linux" .SH ИМЯ pthread_setschedparam, pthread_getschedparam \- изменяет/возвращает параметры и алгоритм планирования нити .SH СИНТАКСИС .nf \fB#include \fP .PP \fBint pthread_setschedparam(pthread_t \fP\fIthread\fP\fB, int \fP\fIpolicy\fP\fB,\fP \fB const struct sched_param *\fP\fIparam\fP\fB);\fP \fBint pthread_getschedparam(pthread_t \fP\fIthread\fP\fB, int *\fP\fIpolicy\fP\fB,\fP \fB struct sched_param *\fP\fIparam\fP\fB);\fP .PP Компилируется и компонуется вместе с \fI\-pthread\fP. .fi .SH ОПИСАНИЕ Функция \fBpthread_setschedparam\fP() назначает параметры и алгоритм планирования нити \fIthread\fP. .PP .\" FIXME . pthread_setschedparam() places no restriction on the policy, .\" but pthread_attr_setschedpolicy() restricts policy to RR/FIFO/OTHER .\" http://sourceware.org/bugzilla/show_bug.cgi?id=7013 В \fIpolicy\fP указывается новый алгоритм планирования \fIthread\fP. Поддерживаемые значения \fIpolicy\fP и их семантика описана в \fBsched\fP(7). .PP Структура, на которую указывает \fIparam\fP определяет новые параметры планирования \fIthread\fP. Параметры планирования хранятся в структуре следующего вида: .PP .in +4n .EX struct sched_param { int sched_priority; /* планируемый приоритет */ }; .EE .in .PP Из той структуры видно, что поддерживается только один параметр. Подробности о разрешённых диапазонах планируемых приоритетов для каждого алгоритма планирования смотрите в \fBsched\fP(7). .PP .\" FIXME . nptl/pthread_setschedparam.c has the following .\" /* If the thread should have higher priority because of some .\" PTHREAD_PRIO_PROTECT mutexes it holds, adjust the priority. */ .\" Eventually (perhaps after writing the mutexattr pages), we .\" may want to add something on the topic to this page. Функция \fBpthread_getschedparam\fP() возвращает параметры и алгоритм планирования нити \fIthread\fP в буфер, указанный \fIpolicy\fP и \fIparam\fP, соответственно. Возвращаемое значение приоритета совпадает с заданным с помощью последнего вызова \fBpthread_setschedparam\fP(), \fBpthread_setschedprio\fP(3) или \fBpthread_create\fP(3), относящегося к \fIthread\fP. Возвращаемые приоритет не отражает каких\-либо временных подстроек приоритета в результате вызовов функций наследования приоритета или потолка (например, смотрите \fBpthread_mutexattr_setprioceiling\fP(3) и \fBpthread_mutexattr_setprotocol\fP(3)). .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении эти функции возвращают 0; при ошибке возвращается ненулевой номер ошибки. Если \fBpthread_setschedparam\fP() завершается ошибкой, то параметры и алгоритм планирования \fIthread\fP не изменяется. .SH ОШИБКИ Это функции могут завершиться со следующей ошибкой: .TP \fBESRCH\fP Нить с идентификатором \fIthread\fP не найдена. .PP Функция \fBpthread_setschedparam\fP() может также завершиться со следующими ошибками: .TP \fBEINVAL\fP Неизвестное значение \fIpolicy\fP или значение \fIparam\fP не имеет смысла для \fIpolicy\fP. .TP \fBEPERM\fP Вызывающий не имеет соответствующих прав для установки указанного алгоритма планирования и параметров. .PP .\" .SH VERSIONS .\" Available since glibc 2.0 Для \fBpthread_setschedparam\fP() в POSIX.1 также описана необязательная ошибка \fBENOTSUP\fP («попытка изменить параметры и алгоритм планирования на не поддерживаемое значение»). .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbw24 lb lb l l l. Интерфейс Атрибут Значение T{ \fBpthread_setschedparam\fP(), \fBpthread_getschedparam\fP() T} Безвредность в нитях MT\-Safe .TE .SH "СООТВЕТСТВИЕ СТАНДАРТАМ" POSIX.1\-2001, POSIX.1\-2008. .SH ЗАМЕЧАНИЯ Список требуемых прав, результат, изменение алгоритма и приоритета планирования нити и подробности разрешённых диапазонов приоритетов для каждого алгоритма планирования смотрите в \fBsched\fP(7). .SH ПРИМЕРЫ Представленная ниже программа показывает использование \fBpthread_setschedparam\fP() и \fBpthread_getschedparam\fP(), а также других относящихся к планированию функций программного интерфейса pthreads. .PP В этом сеансе, главная нить изменяет свой алгоритм планирования на \fBSCHED_FIFO\fP с приоритетом 10, и инициализирует объект атрибутов нити с атрибутом алгоритма планирования \fBSCHED_RR\fP и атрибутом приоритета планирования 20. Затем программа изменяет (с помощью \fBpthread_attr_setinheritsched\fP(3)) атрибут наследования планировщика в объекте атрибутов нити на \fBPTHREAD_EXPLICIT_SCHED\fP, из\-за чего создаваемые с использованием данного объекта атрибутов нити получат значения атрибуты планирования из объекта атрибутов нити. Затем программа создаёт нить с учётом объекта атрибутов нити, после чего эта нить выводит значения своего алгоритма и приоритета планирования. .PP .in +4n .EX $ \fBsu\fP # требуются права для назначения алгоритмов планирования реального времени Пароль: # \fB./a.out \-mf10 \-ar20 \-i e\fP Настройки планировщика главной нити алгоритм=SCHED_FIFO, приоритет=10 Настройки планировщика в \(aqattr\(aq алгоритм=SCHED_RR, приоритет=20 наследование планировщика ЯВНОЕ Атрибуты планировщика в новой нити алгоритм=SCHED_RR, приоритет=20 .EE .in .PP В показанном выше выводе можно видеть приоритет и алгоритм планирования, которые были взяты из объекта атрибутов нити. .PP Следующий сеанс похож на предыдущий, то в нём атрибут наследования планировщика равен \fBPTHREAD_INHERIT_SCHED\fP, то есть создаваемые с использованием объекта атрибутов нити игнорируют значения параметров и алгоритм планирования, заданные в объекте атрибутов нити, и берут их от создавшей нити. .PP .in +4n .EX # \fB./a.out \-mf10 \-ar20 \-i i\fP Настройки планировщика главной нити алгоритм=SCHED_FIFO, приоритет=10 Настройки планировщика в \(aqattr\(aq алгоритм=SCHED_RR, приоритет=20 наследование планировщика ВКЛЮЧЕНО Атрибуты планировщика в новой нити алгоритм=SCHED_FIFO, приоритет=10 .EE .in .PP В показанном выше выводе можно видеть приоритет и алгоритм планирования, которые были взяты из создаваемой нити, а не из объекта атрибутов нити. .PP Заметим, чти если не указать параметр \fI\-i\ i\fP, то вывод будет тем же самым, так как \fBPTHREAD_INHERIT_SCHED\fP является значением по умолчанию для атрибута наследования планировщика. .SS "Исходный код программы" \& .EX /* pthreads_sched_test.c */ #include #include #include #include #include #define handle_error_en(en, msg) \e 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, "Использование: %s [параметры]\en", prog_name); fprintf(stderr, "Параметры:\en"); #define fpe(msg) fprintf(stderr, "\et%s", msg); /* для краткости */ fpe("\-a<алгоритм><приоритет> Алгоритм и приоритет планирования\en"); fpe(" объекте атрибутов нити\en"); fpe(" значения для <алгоритм>:\en"); fpe(" f SCHED_FIFO\en"); fpe(" r SCHED_RR\en"); fpe(" o SCHED_OTHER\en"); fpe("\-A Исп. объект атрибутов нити по умолчанию\en"); fpe("\-i {e|i} Атрибут наследования планировщика\en"); fpe(" \(aqявный\(aq or \(aqунаследованный\(aq\en"); fpe("\-m<алгоритм><приоритет> Алгоритм и приоритет планирования\en"); fpe(" главной нити перед вызовом pthread_create()\en"); exit(EXIT_FAILURE); } static int get_policy(char p, int *policy) { switch (p) { case \(aqf\(aq: *policy = SCHED_FIFO; return 1; case \(aqr\(aq: *policy = SCHED_RR; return 1; case \(aqo\(aq: *policy = SCHED_OTHER; return 1; default: return 0; } } static void display_sched_attr(int policy, struct sched_param *param) { printf(" алгоритм=%s, приоритет=%d\en", (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, ¶m); if (s != 0) handle_error_en(s, "pthread_getschedparam"); printf("%s\en", msg); display_sched_attr(policy, ¶m); } static void * thread_start(void *arg) { display_thread_sched_attr("Атрибуты планировщика в новой нити"); 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; /* обработка параметров командной строки */ 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 \(aqa\(aq: attr_sched_str = optarg; break; case \(aqA\(aq: use_null_attrib = 1; break; case \(aqi\(aq: inheritsched_str = optarg; break; case \(aqm\(aq: main_sched_str = optarg; break; default: usage(argv[0], "Неизвестный параметр\en"); } } if (use_null_attrib && (inheritsched_str != NULL || attr_sched_str != NULL)) usage(argv[0], "Нельзя указывать \-A вместе с \-i или \-a\en"); /* необязательная установка атрибутов планирования главной нити вывод этих атрибутов */ if (main_sched_str != NULL) { if (!get_policy(main_sched_str[0], &policy)) usage(argv[0], "Некоррект. алгоритм для главной нити (\-m)\en"); param.sched_priority = strtol(&main_sched_str[1], NULL, 0); s = pthread_setschedparam(pthread_self(), policy, ¶m); if (s != 0) handle_error_en(s, "pthread_setschedparam"); } display_thread_sched_attr("Настройки планировщика главной нити"); printf("\en"); /* инициализация объекта атрибутов нити согласно параметрам */ 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] == \(aqe\(aq) inheritsched = PTHREAD_EXPLICIT_SCHED; else if (inheritsched_str[0] == \(aqi\(aq) inheritsched = PTHREAD_INHERIT_SCHED; else usage(argv[0], "Значение \-i должно быть \(aqe\(aq или \(aqi\(aq\en"); 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], "Некорректный алгоритм для \(aqattr\(aq (\-a)\en"); 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, ¶m); if (s != 0) handle_error_en(s, "pthread_attr_setschedparam"); } /* если мы инициализируем объект атрибутов нити, то покажем атрибуты планирования, установленные в объекте */ if (attrp != NULL) { s = pthread_attr_getschedparam(&attr, ¶m); 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("Настройки планировщика в \(aqattr\(aq\en"); display_sched_attr(policy, ¶m); s = pthread_attr_getinheritsched(&attr, &inheritsched); printf(" наследование планировщика %s\en", (inheritsched == PTHREAD_INHERIT_SCHED) ? "ВКЛЮЧЕНО" : (inheritsched == PTHREAD_EXPLICIT_SCHED) ? "ЯВНОЕ" : "???"); printf("\en"); } /* создаём нить, которая покажет свои атрибуты планирования */ s = pthread_create(&thread, attrp, &thread_start, NULL); if (s != 0) handle_error_en(s, "pthread_create"); /* уничтожаем ненужный объект атрибутов нити */ 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); } .EE .SH "СМ. ТАКЖЕ" .ad l .nh \fBgetrlimit\fP(2), \fBsched_get_priority_min\fP(2), \fBpthread_attr_init\fP(3), \fBpthread_attr_setinheritsched\fP(3), \fBpthread_attr_setschedparam\fP(3), \fBpthread_attr_setschedpolicy\fP(3), \fBpthread_create\fP(3), \fBpthread_self\fP(3), \fBpthread_setschedprio\fP(3), \fBpthreads\fP(7), \fBsched\fP(7) .SH ЗАМЕЧАНИЯ Эта страница является частью проекта Linux \fIman\-pages\fP версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу \%https://www.kernel.org/doc/man\-pages/. .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Alexey, Azamat Hackimov , kogamatranslator49 , Kogan, Max Is , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .