在Linux上以root用户身份调用SCHED_FIFO线程的pthread_create()时获取EPERM

在Linux上以root用户身份调用SCHED_FIFO线程的pthread_create()时获取EPERM,第1张

概述我试图在 Linux系统上以root身份生成带有SCHED_FIFO或SCHED_RR策略的线程,但是我对pthread_create()的调用返回1(EPERM). pthread_create()的手册页说EPERM表示“调用者没有适当的权限来设置所需的调度参数或调度策略.”不应该root能够指定SCHED_FIFO或SCHED_RR吗? 我已经删除了将一个线程创建到一个只执行该 *** 作的小程序中 我试图在 Linux系统上以root身份生成带有SCHED_FIFO或SCHED_RR策略的线程,但是我对pthread_create()的调用返回1(EPERM). pthread_create()的手册页说EPERM表示“调用者没有适当的权限来设置所需的调度参数或调度策略.”不应该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,"pthread_join error %d\n",retVal);        exit(1);    }    printf("main run successfully\n");    return 0;}

该程序已编译并以root身份运行.运行时,程序在调用pthread_create时失败,返回EPERM.

将线程更改为SCHED_RR调度没有任何效果 – 仍然由pthread_create返回EPERM.

将线程更改为SCHED_OTHER调度并将其优先级更改为0允许程序无错误地运行.

解决方法 必须是您的实时优先级软限制过于严格.

在运行代码之前,在shell中调用ulimit -r unlimited.或者直接在代码中调用setrlimit(RliMIT_RTPRIO,…).

系统范围的限制在/etc/security/limits.conf中设置.

总结

以上是内存溢出为你收集整理的在Linux上以root用户身份调用SCHED_FIFO线程的pthread_create()时获取EPERM全部内容,希望文章能够帮你解决在Linux上以root用户身份调用SCHED_FIFO线程的pthread_create()时获取EPERM所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1025651.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存