【问题标题】:why sched_setscheduler() does not work if not wrapped within an if block?为什么 sched_setscheduler() 如果没有包裹在 if 块中就不起作用?
【发布时间】:2013-05-11 21:49:01
【问题描述】:

以下代码有效且需要“root”身份验证:

struct sched_param param;
param.sched_priority = 99;
if (sched_setscheduler(0, SCHED_FIFO, & param) != 0) {
    perror("sched_setscheduler");
exit(EXIT_FAILURE);  
}

但是,这个似乎工作(没有错误)但没有效果并且不需要“root”身份验证:

struct sched_param param;
param.sched_priority = 99;
sched_setscheduler(0, SCHED_FIFO, & param);

为什么?我用 gcc / Ubuntu 13 编译。

【问题讨论】:

    标签: c scheduled-tasks real-time


    【解决方案1】:

    很可能sched_setscheduler 在您的第二个示例中不起作用。您只是忽略了可能不是0 的返回值。

    由于您忽略了返回值,您实际上并不知道它是否有效。

    查看sched_setscheduler 的手册页,您会在返回值下找到它

    RETURN VALUE
           On success, sched_setscheduler() returns zero.  
           On success, sched_getscheduler() returns the policy for the process (a nonnegative integer).
           On error, -1 is returned, and errno is set appropriately.
    

    如果返回 -1,则设置 errno 并且 perror 打印一个人类可读的错误字符串。

    既然你说-1 是从第二个示例返回的,sched_setscheduler 实际上并没有工作。

    【讨论】:

    • 即使我的 main() 仅包含此代码,第一个示例仍然有效,但第二个示例未设置调度程序。我不明白为什么只是省略 if 块会导致事情出错。
    • 你能检查第二个的返回值吗?这是什么?
    • 在第一个示例中,没有任何错误消息,它运行良好(当然,如果我是“root”)。
    • 尤里卡!我明白。在“root”模式下启动时,这两个示例都运行良好。但是当以用户模式(不是“root”)启动时,第一个声明为“root”(它显示“不允许操作”),然后在切换到“root”模式后工作。第二个不显示错误消息。所以,我认为它不起作用。但它在我切换到“root”模式时也可以工作。谢谢
    • @user2373781 Accept 有帮助的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2015-09-17
    • 1970-01-01
    相关资源
    最近更新 更多