我已经删除了将一个线程创建到一个只执行该 *** 作的小程序中的代码.它看起来对我来说,但仍然得到错误.我究竟做错了什么?
该程序:
#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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)