Получение EPERM при вызове pthread_create () для потока SCHED_FIFO от имени пользователя root в Linux - PullRequest
5 голосов
/ 16 февраля 2012

Я пытаюсь порождать потоки с политиками SCHED_FIFO или SCHED_RR от имени root в системе Linux, но мои вызовы pthread_create () возвращают 1 (EPERM).Страница man для pthread_create () говорит, что EPERM указывает, что «[t] вызывающий не имеет соответствующего разрешения для установки необходимых параметров планирования или политики планирования».Разве root не может указывать SCHED_FIFO или SCHED_RR?

Я удалил код, который создает поток в небольшую программу, которая делает только это.Это выглядит правильно для меня, но все еще получает ошибку.Что я делаю не так?

Программа:

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

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

Эта программа была скомпилирована и запущена от имени пользователя root.При запуске программа завершается ошибкой при вызове pthread_create, возвращая EPERM.

Изменение потока на планирование SCHED_RR не имеет никакого эффекта - EPERM все еще возвращается pthread_create.

Изменение потока на планирование SCHED_OTHER иПриоритет 0 позволяет программе работать без ошибок.

Ответы [ 3 ]

5 голосов
/ 16 февраля 2012

Должно быть, ваше мягкое ограничение приоритета в реальном времени слишком ограничено.

Либо вызовите ulimit -r unlimited в оболочке перед запуском вашего кода.Или позвоните setrlimit(RLIMIT_RTPRIO, ...) прямо в свой код.

Общесистемные ограничения установлены в /etc/security/limits.conf.

1 голос
/ 16 февраля 2012

Я протестировал ваш код на Linux (ядро 2.6), Solaris 9 и 10. Никаких проблем. Это связано с вашими приоритетами в реальном времени. Вы можете изменить это с помощью:

ulimit -r unlimited

упс. Максим уже попал сюда с ответом ....

0 голосов
/ 25 апреля 2014

Запустите программу от имени пользователя root. Потому что мы возимся с расписанием (это для FIFO и RR). вы также (косвенно) связываетесь с относительными приоритетами, и это может сделать только root.

При нормальном запуске над программой pthread_creare () возвращает EPERM, но, как пользователь root, работает нормально.

Для получения дополнительной информации посетите: http://www.linuxforums.org/forum/programming-scripting/111359-pthread-error.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...