将Golang进程设置为FIFO优先级

假设我们用Golang编写了一个读取并处理传感器数据的进程。
在众多进程中,我们希望该进程不被太过拖后腿,因此我们想将其优先级设置为FIFO级别。

Golang的goroutine无法控制在哪个线程上运行。因此,即使在goroutine内部调用设置线程优先级的系统调用,结果也是不确定的。

因此,我先设置了自己流程的优先级,然后创建了一个用于执行Golang可执行文件的工具。

#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <unistd.h>

int run_fifoprio(int fifoprio, char** cmd)
{
    struct sched_param param;

    param.sched_priority = fifoprio;
    if (sched_setscheduler(0, SCHED_FIFO, &param) < 0) {
        perror("sched_setscheduler");
        return -1;
    }
    return execvp(cmd[0], cmd);
}


int main(int argc, char** argv)
{
    if (argc < 3) {
        printf("usage: %s fifo_prio command ... \n", argv[0]);
        return 0;
    }
    return (run_fifoprio(atoi(argv[1]), &argv[2]));
}

使用方法 (shǐ fǎ)

使用FIFO优先级10执行名为foo的Golang可执行文件。

$ run_fifo_prio 10 foo

限制事项

普通用户没有权限设置为FIFO优先级,所以需要以root权限来执行。

附加信息

如果你想在没有root权限的情况下运行Golang进程,可以尝试给run_fifoprio分配CAP_SYS_NICE的能力,这样应该可以成功(但在ARM Linux上尚未经过验证)。

使用sudo设置权限

sudo setcap cap_sys_nice=ep run_fifoprio

广告
将在 10 秒后关闭
bannerAds