Por que o sudo user pode usar sched_setscheduler SCHED_RR enquanto o root não pode?

3

Estou executando o Arch Linux em um Raspberry Pi 2.

Eu tenho um programa de espaço de usuário que usa a biblioteca wiringPi de Gordon e, em particular, os piHiPri() function que tenta definir a prioridade mais alta para o processo atual (usando sched_setscheduler e SCHED_RR mode). Esta função precisa de privilégios de superusuário.

O usuário root é o padrão ao instalar o Arch Linux, então criei um usuário chamado builder que adicionei a sudoers graças a visudo .

Meu problema é: quando executo o programa com o usuário root , a função sched_setscheduler retorna "Operação não permitida" (obtendo a partir de errno ).

Se eu o executar enquanto estiver sendo builder , receberei uma "permissão negada".

No entanto, se eu executar com sudo myProgram sendo builder , está tudo bem e posso ver que a prioridade mudou com o comando top .

Eu pensei que o usuário root pode não ter o UID 0, então eu verifiquei com id -u root , mas isso retorna 0.

ls -l myProgramm-rwxr-xr-x 1 root root . Eu também tentei definir SUID com chmod +s myProgramm sem sucesso.

Alguma ideia de como tornar meu programa executável por root?

EDITAR:

Como Gilles aconselhou, executei ulimit -r e ele retornou 0 em todos os casos ( builder e root ).

Alterei uma linha em /etc/security/limits.conf de: * - rtprio 0

Para: * - rtprio 99

Isso afetou a saída de ulimit -r como esperado: ela retorna agora 99.

Tentei novamente executar meu programa com root , mas ainda tenho o mesmo erro Operation not permitted e agora ele não funciona mais com sudo (mesmo Operation not permitted como acima )... estranho !

Durante a investigação, reverti para as configurações antigas de /etc/security/limits.conf .

    
por Vladimir T. 05.06.2015 / 14:58

1 resposta

2

Uma coisa que poderia explicar a diferença é se você está terminando com limites diferentes para a prioridade máxima em tempo real ( ulimit -r ). A raiz não pode exceder o limite, mas pode aumentá-lo. Verifique com ulimit -r (ou, em C, com getrlimit(RLIMIT_RTPRIO, …) e aumente o limite antes de executar seu programa, se necessário.

Se isso não ajudar, provavelmente é um problema no seu programa, e não um problema na configuração do seu sistema. Poste um código-fonte pequeno, mas autocontido, que reproduza o problema , em Stack Overflow (a programação está fora do tópico em Unix & Linux ).

    
por 07.06.2015 / 00:13