以下代码运行时,报错(使用root运行也是同样的错误)
sched_setscheduler(): Operation not permitted
希望各位大神们帮忙解决,谢谢。
struct sched_param param;
param.sched_priority = 1;
if (sched_setscheduler(getpid(), SCHED_RR, ¶m))
printf("sched_setscheduler(): %s\n", strerror(errno));
离线
贴可重现问题的完整代码?
离线
贴可重现问题的完整代码?
代码如下:
#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, ¶m))
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)
离线
百合仙子 说:贴可重现问题的完整代码?
代码如下:
#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, ¶m)) printf("sched_setscheduler(): %s\n", strerror(errno)); return 0; }
我这里 root 可以执行。你是不是在某种 container 里运行的?或者有 SELinux 之类的东西?
离线
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, ¶m)) printf("sched_setscheduler(): %s\n", strerror(errno)); return 0; }
我这里 root 可以执行。你是不是在某种 container 里运行的?或者有 SELinux 之类的东西?
我在Virtualbox中安装的archlinux运行的,这个有影响吗?
最近编辑记录 jxymax (2015-01-06 14:48:33)
离线
百合仙子 说:我这里 root 可以执行。你是不是在某种 container 里运行的?或者有 SELinux 之类的东西?
我在Virtualbox中安装的archlinux运行的,这个有影响吗?
那好奇怪。应该是没影响的。看看系统日志?
离线
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)
离线
说个不太紧要的, 楼主用gdb跟一下至少比strace好吧。。。
离线
啊。。。没有认真看。。。
上面那段说了
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.
离线
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)
离线
已经知道原因了。。
这里说什么因为实时操作系统,cgroup, blablabla的原因
所以停掉cgroup就没事了
内核启动参数加上 "cgroup_disable=cpu,cpuset,memory"
就没问题了
最近编辑记录 atmouse (2015-01-06 15:52:38)
离线
啊。。。没有认真看。。。
上面那段说了
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之后,权限会有问题吗?但是我没有使用这个啊?
能帮忙解释一下吗,谢谢了。
英语都还给老师了
离线
已经知道原因了。。
什么原因,快告诉我,谢谢了,我被折磨好多天了。
离线
11楼补上原因了。。。。。网址忘了补充了,。。。http://www.novell.com/support/kb/doc.php?id=7012851
最近编辑记录 atmouse (2015-01-06 16:00:28)
离线
11楼补上原因了。。。。。网址忘了补充了,。。。http://www.novell.com/support/kb/doc.php?id=7012851
按照11楼修改,问题解决了,非常感谢!!!
最近编辑记录 jxymax (2015-01-06 16:42:31)
离线