Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查sched_setscheduler()的权限? 我有一个C++应用程序,调用 SeDeStStayStor(PID,SHIDEHR RR,…)< /C>_C++_Linux_Permissions_Scheduler_Vps - Fatal编程技术网

如何检查sched_setscheduler()的权限? 我有一个C++应用程序,调用 SeDeStStayStor(PID,SHIDEHR RR,…)< /C>

如何检查sched_setscheduler()的权限? 我有一个C++应用程序,调用 SeDeStStayStor(PID,SHIDEHR RR,…)< /C>,c++,linux,permissions,scheduler,vps,C++,Linux,Permissions,Scheduler,Vps,应用程序在具有根权限的Linux上运行。这个电话通常是有效的。仅在一个特定的虚拟专用服务器中,它会因EPERM而失败 有没有人见过这样一种情况:具有根权限的进程不能这样做 如何检查进程是否具有避免调用所需的所有权限 更新: 我发现它唯一的基于Virtuozzo的虚拟服务器就是发生这种情况的地方。使用例如KVM的虚拟机是正常的。您是否试图更改应用程序本身或系统中其他进程的优先级 手册页man 2 sched_setscheduler在特权和资源限制一节中指出,只有拥有CAP_SYS_NICE功能的

应用程序在具有根权限的Linux上运行。这个电话通常是有效的。仅在一个特定的虚拟专用服务器中,它会因
EPERM
而失败

有没有人见过这样一种情况:具有根权限的进程不能这样做

如何检查进程是否具有避免调用所需的所有权限

更新:
我发现它唯一的基于Virtuozzo的虚拟服务器就是发生这种情况的地方。使用例如KVM的虚拟机是正常的。

您是否试图更改应用程序本身或系统中其他进程的优先级

手册页
man 2 sched_setscheduler
在特权和资源限制一节中指出,只有拥有CAP_SYS_NICE功能的进程才能将调度策略更改为实时。至少在2.6.12之前的内核中是这样,在更新的内核中会变得更复杂

可能给你带来麻烦的机器有一些关于功能或其他方面的特殊配置


我认为,要检测到这种情况,您只需继续执行您已经执行的操作:调用sched_setscheduler,如果它返回EPERM,那么就没有权限。

您是在尝试更改应用程序本身还是系统中其他进程的优先级

手册页
man 2 sched_setscheduler
在特权和资源限制一节中指出,只有拥有CAP_SYS_NICE功能的进程才能将调度策略更改为实时。至少在2.6.12之前的内核中是这样,在更新的内核中会变得更复杂

可能给你带来麻烦的机器有一些关于功能或其他方面的特殊配置


我认为,要检测到这种情况,您只需继续执行您已经执行的操作:调用sched_setscheduler,如果它返回EPERM,那么就没有权限。

您是在尝试更改应用程序本身还是系统中其他进程的优先级

手册页
man 2 sched_setscheduler
在特权和资源限制一节中指出,只有拥有CAP_SYS_NICE功能的进程才能将调度策略更改为实时。至少在2.6.12之前的内核中是这样,在更新的内核中会变得更复杂

可能给你带来麻烦的机器有一些关于功能或其他方面的特殊配置


我认为,要检测到这种情况,您只需继续执行您已经执行的操作:调用sched_setscheduler,如果它返回EPERM,那么就没有权限。

您是在尝试更改应用程序本身还是系统中其他进程的优先级

手册页
man 2 sched_setscheduler
在特权和资源限制一节中指出,只有拥有CAP_SYS_NICE功能的进程才能将调度策略更改为实时。至少在2.6.12之前的内核中是这样,在更新的内核中会变得更复杂

可能给你带来麻烦的机器有一些关于功能或其他方面的特殊配置


我认为,要检测这种情况,您只需继续执行您已经执行的操作:调用sched_setscheduler,如果它返回EPERM,那么就没有权限。

不确定您正在运行哪个内核,但这个问题已经讨论过了。解决办法是。问题在于
CONFIG_SCHED_AUTOGROUP
;它不支持
SCHED_RR
SCHED_FIFO
。然而,如果你像我一样,这可能仍然不能解决你的问题。问题在于
kernel/sched/core.c
kernel/sched.c
早期内核中的
kernel/sched.c
中的此代码(此3.4.47代码包含上述补丁):

在我的例子中,一个系统工作,一个系统不工作,这取决于
!task\u group\u是自动组(task\u group(p))
子句(两个系统运行完全相同的内核)。在出现故障的系统中,该子句的计算结果为1(即,它不在自动组中)。该补丁最早出现在3.1.10内核中。听起来你的问题和我的一样,因为只有一个系统出了故障。这指向一个配置问题。我没有发现启用的
/proc/sys/kernel/sched_autogroup_
解决了这个问题;我在启用自动组的情况下遇到了上述问题,当我禁用它时,遇到了另一个问题(
rt\u runtime
在一个系统上为零,在另一个系统上为950000000),即使
/sys/fs/cgroup/cpu,cpuacct/cpu.rt\u runtime\u us
(我认为这是一个直接链接,或者至少与
rt\u runtime
相关)在这两种情况下都是950000000

因此,看起来有一个任务被分配给自动组并成功,而有一个任务未被分配并失败,因为它没有运行时

更新:


我确实找到了一种解决方案,我在中讨论过。如果我更改进程的cgroup映射,使其位于根cgroup中,那么问题就解决了。通过在
/etc/systemd/system.conf
中将
DefaultController
设置为null,可以永久更改此设置

不确定您正在运行哪个内核,但讨论了这个问题。解决办法是。问题在于
CONFIG_SCHED_AUTOGROUP
;它不支持
SCHED_RR
SCHED_FIFO
。然而,如果你像我一样,这可能仍然不能解决你的问题。问题在于
kernel/sched/core.c
kernel/sched.c
早期内核中的
kernel/sched.c
中的此代码(此3.4.47代码包含上述补丁):

在我的例子中,一个系统工作,一个系统不工作,这取决于
!task\u group\u是自动组(task\u group(p))
子句(两个系统运行完全相同的内核)。在出现故障的系统中,该子句的计算结果为1(即,它不在
/*
 * Do not allow realtime tasks into groups that have no runtime
 * assigned.
 */
if (rt_bandwidth_enabled() && rt_policy(policy) &&
        task_group(p)->rt_bandwidth.rt_runtime == 0 &&
        !task_group_is_autogroup(task_group(p))) {
    task_rq_unlock(rq, p, &flags);
    return -EPERM;
}