linux fifo实现多线程,在Linux上以root用户身份调用SCHED_FIFO线程的pthread_create()时获取EPERM...

我试图在

Linux系统上以root身份生成带有SCHED_FIFO或SCHED_RR策略的线程,但是我对pthread_create()的调用返回1(EPERM). pthread_create()的手册页说EPERM表示“调用者没有适当的权限来设置所需的调度参数或调度策略.”不应该root能够指定SCHED_FIFO或SCHED_RR吗?

我已经删除了将一个线程创建到一个只执行该操作的小程序中的代码.它看起来对我来说,但仍然得到错误.我究竟做错了什么?

该程序:

#include

#include

#include

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调度没有任何效果 – 仍然由pthread_create返回EPERM.

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值