2013-02-20 1 views
0

Мне нужно запустить программу на C++ в режиме реального времени на BeagleBone с Angstrom Linux версии 3.2.18. Программа вызывает pthread_setschedparam, чтобы попытаться повысить приоритет. При входе в систему с правами пользователя root появляется ошибка «Операция не разрешена». Однако, если я сначала поднимусь на суперпользователь «su» в командной строке, вызов pthread_setschedparam будет успешным.Как получить разрешение для pthread_setschedparam

Как добиться того же результата без запуска «su» в первую очередь? Мне нужно запустить эту программу как службу, которая запускается автоматически во время загрузки.

ответ

3

В manpage для pthread_setschedparam (я предполагаю, что это то, что вы имели в виду), говорится в заметках:

Для описания разрешений, необходимых для и влияния, изменения политики диспетчеризации потока и приоритет , а также подробные сведения о допустимых диапазонах приоритетов в каждой политике планирования, см. sched_setscheduler (2).

В that manpage, он подробно под Privileges and resource limits:

В Linux ядра 2.6.12 до того, только привилегированные (CAP_SYS_NICE) процессы могут установить отличный от нуля статический приоритет (то есть, установить политику планирования в реальном масштабе времени). Единственное изменение, которое может сделать непривилегированный процесс, - это установить политику SCHED_OTHER, и это можно сделать только в том случае, если эффективный идентификатор пользователя вызывающего объекта sched_setscheduler() соответствует реальному или эффективному идентификатору пользователя целевого процесса (то есть процесс указанный pid), чья политика изменяется.

Начиная с Linux 2.6.12, ограничение ресурса RLIMIT_RTPRIO определяет ограничение на статический приоритет непривилегированного процесса для политик SCHED_RR и SCHED_FIFO. Правила для изменения политики планирования и приоритета следующим образом:

  • Если непривилегированный процесс имеет ненулевой RLIMIT_RTPRIO мягкий предел, то он может изменить свою политику планирования и приоритет, при условии ограничения, что приоритет не может быть установлен на значение, превышающее максимальное значение его текущего приоритета и его мягкий предел RLIMIT_RTPRIO.

  • Если мягкий предел RLIMIT_RTPRIO равен 0, то только разрешенные изменения должны снизить приоритет или переключиться на политику, отличную от реального времени.

  • В соответствии с теми же правилами другой непривилегированный процесс также может вносить эти изменения, если эффективный идентификатор пользователя процесса, делающего изменение, соответствует реальному или эффективному идентификатору пользователя целевого процесса.

  • Для SCHED_IDLE применяются специальные правила: непривилегированный процесс, действующий в рамках этой политики, не может изменить свою политику независимо от значения ее ресурса RLIMIT_RTPRIO.

Привилегированные (CAP_SYS_NICE) процессы игнорируют ограничение RLIMIT_RTPRIO; как и в случае с более старыми ядрами, они могут вносить произвольные изменения в политику планирования и приоритет. См. Getrlimit (2) для получения дополнительной информации о RLIMIT_RTPRIO.

 Смежные вопросы

  • Нет связанных вопросов^_^