您尚未登录。

#1 2015-01-06 11:16:53

jxymax
会员
注册时间: 2015-01-06
帖子: 9

【求助】sched_setscheduler(): Operation not permitted

以下代码运行时,报错(使用root运行也是同样的错误)
sched_setscheduler(): Operation not permitted
希望各位大神们帮忙解决,谢谢。

struct sched_param param;
param.sched_priority = 1;
if (sched_setscheduler(getpid(), SCHED_RR, &param))
    printf("sched_setscheduler(): %s\n", strerror(errno));

离线

#2 2015-01-06 12:02:38

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 【求助】sched_setscheduler(): Operation not permitted

贴可重现问题的完整代码?

离线

#3 2015-01-06 13:43:10

jxymax
会员
注册时间: 2015-01-06
帖子: 9

Re: 【求助】sched_setscheduler(): Operation not permitted

百合仙子 说:

贴可重现问题的完整代码?

代码如下:

#include <iostream>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
using namespace std;

int main(int argc, char** argv)
{
    struct sched_param param;
    param.sched_priority = 1;
    if (sched_setscheduler(getpid(), SCHED_RR, &param))
        printf("sched_setscheduler(): %s\n", strerror(errno));
    return 0;
}

strace结果

[root@ArchLinux02 prog]# strace ./a
execve("./a", ["./a"], [/* 29 vars */]) = 0
brk(0)                                  = 0x8d4d000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7730000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=66753, ...}) = 0
mmap2(NULL, 66753, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb771f000
close(3)                                = 0
open("/usr/lib/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@j\4\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1314212, ...}) = 0
mmap2(NULL, 1001712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb762a000
mmap2(0xb7713000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe9000) = 0xb7713000
mmap2(0xb7718000, 26864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7718000
close(3)                                = 0
open("/usr/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\300\177\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=2040048, ...}) = 0
mmap2(NULL, 1805988, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7471000
mmap2(0xb7622000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b0000) = 0xb7622000
mmap2(0xb7628000, 7844, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7628000
close(3)                                = 0
open("/usr/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20F\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=308792, ...}) = 0
mmap2(NULL, 311456, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7424000
mmap2(0xb746f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x4a000) = 0xb746f000
close(3)                                = 0
open("/usr/lib/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240 \0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=471504, ...}) = 0
mmap2(NULL, 117524, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7407000
mmap2(0xb7423000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b000) = 0xb7423000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7406000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7405000
set_thread_area({entry_number:-1, base_addr:0xb7405700, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 (entry_number:6)
mprotect(0xb7622000, 16384, PROT_READ)  = 0
mprotect(0xb746f000, 4096, PROT_READ)   = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7404000
mprotect(0xb7713000, 16384, PROT_READ)  = 0
mprotect(0x8049000, 4096, PROT_READ)    = 0
mprotect(0xb7755000, 4096, PROT_READ)   = 0
munmap(0xb771f000, 66753)               = 0
getpid()                                = 414
sched_setscheduler(414, SCHED_RR, { 1 }) = -1 EPERM (Operation not permitted)
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb772f000
write(1, "sched_setscheduler(): Operation "..., 46sched_setscheduler(): Operation not permitted
) = 46
exit_group(0)                           = ?
+++ exited with 0 +++

最近编辑记录 jxymax (2015-01-06 13:45:25)

离线

#4 2015-01-06 13:52:23

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 【求助】sched_setscheduler(): Operation not permitted

jxymax 说:
百合仙子 说:

贴可重现问题的完整代码?

代码如下:

#include <iostream>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
using namespace std;

int main(int argc, char** argv)
{
    struct sched_param param;
    param.sched_priority = 1;
    if (sched_setscheduler(getpid(), SCHED_RR, &param))
        printf("sched_setscheduler(): %s\n", strerror(errno));
    return 0;
}

我这里 root 可以执行。你是不是在某种 container 里运行的?或者有 SELinux 之类的东西?

离线

#5 2015-01-06 14:48:09

jxymax
会员
注册时间: 2015-01-06
帖子: 9

Re: 【求助】sched_setscheduler(): Operation not permitted

百合仙子 说:
jxymax 说:
百合仙子 说:

贴可重现问题的完整代码?

代码如下:

#include <iostream>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
using namespace std;

int main(int argc, char** argv)
{
    struct sched_param param;
    param.sched_priority = 1;
    if (sched_setscheduler(getpid(), SCHED_RR, &param))
        printf("sched_setscheduler(): %s\n", strerror(errno));
    return 0;
}

我这里 root 可以执行。你是不是在某种 container 里运行的?或者有 SELinux 之类的东西?

我在Virtualbox中安装的archlinux运行的,这个有影响吗?

最近编辑记录 jxymax (2015-01-06 14:48:33)

离线

#6 2015-01-06 14:54:10

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 【求助】sched_setscheduler(): Operation not permitted

jxymax 说:
百合仙子 说:

我这里 root 可以执行。你是不是在某种 container 里运行的?或者有 SELinux 之类的东西?

我在Virtualbox中安装的archlinux运行的,这个有影响吗?

那好奇怪。应该是没影响的。看看系统日志?

离线

#7 2015-01-06 14:57:59

atmouse
会员
注册时间: 2011-08-24
帖子: 701

Re: 【求助】sched_setscheduler(): Operation not permitted

priority的范围要先查询下 => http://man7.org/linux/man-pages/man2/sc … min.2.html 看这里

不然范围外就会报 EPERM

改: 我再认真看了下,http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html, 如果上面说的selinux设置了, 那么也有可能,这里说linux一般都是 1到99.。。额。。

最近编辑记录 atmouse (2015-01-06 15:16:15)

离线

#8 2015-01-06 15:00:16

atmouse
会员
注册时间: 2011-08-24
帖子: 701

Re: 【求助】sched_setscheduler(): Operation not permitted

说个不太紧要的, 楼主用gdb跟一下至少比strace好吧。。。

离线

#9 2015-01-06 15:19:59

atmouse
会员
注册时间: 2011-08-24
帖子: 701

Re: 【求助】sched_setscheduler(): Operation not permitted

啊。。。没有认真看。。。

上面那段说了
Since Linux 2.6.32, the SCHED_RESET_ON_FORK flag can be ORed in
       policy when calling sched_setscheduler().  As a result of including
       this flag, children created by fork(2) do not inherit privileged
       scheduling policies.  See sched(7) for details.

离线

#10 2015-01-06 15:34:13

jxymax
会员
注册时间: 2015-01-06
帖子: 9

Re: 【求助】sched_setscheduler(): Operation not permitted

atmouse 说:

priority的范围要先查询下 => http://man7.org/linux/man-pages/man2/sc … min.2.html 看这里

不然范围外就会报 EPERM

改: 我再认真看了下,http://man7.org/linux/man-pages/man2/sched_setscheduler.2.html, 如果上面说的selinux设置了, 那么也有可能,这里说linux一般都是 1到99.。。额。。

范围应该没有问题

[root@ArchLinux02 prog]# chrt -m
SCHED_OTHER min/max priority	: 0/0
SCHED_FIFO min/max priority	: 1/99
SCHED_RR min/max priority	: 1/99
SCHED_BATCH min/max priority	: 0/0
SCHED_IDLE min/max priority	: 0/0

使用以下方式运行都没有问题:
1. 使用光盘启动,然后挂载分区,运行该程序就没有问题。
2. Ubuntun的root用户运行没有问题。
但是使用Ubuntu的普通用户执行该程序得到同样的错误——感觉安装的archlinux系统中的root好像权限不够的样子,这种情况可能吗?

最近编辑记录 jxymax (2015-01-06 15:35:17)

离线

#11 2015-01-06 15:50:52

atmouse
会员
注册时间: 2011-08-24
帖子: 701

Re: 【求助】sched_setscheduler(): Operation not permitted

已经知道原因了。。
这里说什么因为实时操作系统,cgroup, blablabla的原因

所以停掉cgroup就没事了

内核启动参数加上 "cgroup_disable=cpu,cpuset,memory"
就没问题了

最近编辑记录 atmouse (2015-01-06 15:52:38)

离线

#12 2015-01-06 15:51:49

jxymax
会员
注册时间: 2015-01-06
帖子: 9

Re: 【求助】sched_setscheduler(): Operation not permitted

atmouse 说:

啊。。。没有认真看。。。

上面那段说了
Since Linux 2.6.32, the SCHED_RESET_ON_FORK flag can be ORed in
       policy when calling sched_setscheduler().  As a result of including
       this flag, children created by fork(2) do not inherit privileged
       scheduling policies.  See sched(7) for details.

没太看明白,是说使用SCHED_RESET_ON_FORK之后,权限会有问题吗?但是我没有使用这个啊?
能帮忙解释一下吗,谢谢了。
英语都还给老师了 lol

离线

#13 2015-01-06 15:52:29

jxymax
会员
注册时间: 2015-01-06
帖子: 9

Re: 【求助】sched_setscheduler(): Operation not permitted

atmouse 说:

已经知道原因了。。

什么原因,快告诉我,谢谢了,我被折磨好多天了。

离线

#14 2015-01-06 15:53:08

atmouse
会员
注册时间: 2011-08-24
帖子: 701

Re: 【求助】sched_setscheduler(): Operation not permitted

11楼补上原因了。。。。。网址忘了补充了,。。。http://www.novell.com/support/kb/doc.php?id=7012851

最近编辑记录 atmouse (2015-01-06 16:00:28)

离线

#15 2015-01-06 16:12:28

jxymax
会员
注册时间: 2015-01-06
帖子: 9

Re: 【求助】sched_setscheduler(): Operation not permitted

atmouse 说:

11楼补上原因了。。。。。网址忘了补充了,。。。http://www.novell.com/support/kb/doc.php?id=7012851

按照11楼修改,问题解决了,非常感谢!!!

最近编辑记录 jxymax (2015-01-06 16:42:31)

离线

页脚