c++ - 如何从 C/C++ 在 Linux 中设置 IRQ 优先级?

标签 c++ c linux system-calls interrupt

现在我正在使用 chrt 在实时 Linux 中设置 IRQ 优先级(对于给定的 irqPid):

/usr/bin/chrt -f -p 95 irqPid

有没有一种方法/一些函数可以从 C/C++ 执行此操作(除了运行 system() 来执行上面的命令)?

最佳答案

你可能想要 sched_setattr .使用 strace查看 chrt 正在使用的系统调用非常简单。

$ sleep 10 &
[2] 3590
$ sudo strace -- /usr/bin/chrt -f -p 95 $! 2>&1 | grep "=95"
sched_setattr(3590, {size=48, sched_policy=SCHED_FIFO, sched_flags=0, sched_nice=0, sched_priority=95, sched_runtime=0, sched_deadline=0, sched_period=0}, 0) = 0

为当前进程执行此操作的一些代码如下所示:

#include <sched.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <sys/syscall.h>
#include <unistd.h>

struct sched_attr {
   uint32_t size;              /* Size of this structure */
   uint32_t sched_policy;      /* Policy (SCHED_*) */
   uint64_t sched_flags;       /* Flags */
   int32_t  sched_nice;        /* Nice value (SCHED_OTHER,
                                  SCHED_BATCH) */
   uint32_t sched_priority;    /* Static priority (SCHED_FIFO,
                                  SCHED_RR) */
   /* Remaining fields are for SCHED_DEADLINE */
   uint64_t sched_runtime;
   uint64_t sched_deadline;
   uint64_t sched_period;
};

static int sched_setattr(pid_t pid, const struct sched_attr *attr, unsigned int flags)
{
    return syscall(SYS_sched_setattr, pid, attr, flags);
}

int main(int, char**) {
    int result;
    struct sched_attr attr;
    memset(&attr, 0, sizeof(attr));
    attr.size = sizeof(sched_attr);
    attr.sched_priority = 95;
    attr.sched_policy = SCHED_FIFO;
    result = sched_setattr(getpid(), &attr, 0);
    if (result == -1) {
        perror("Error calling sched_setattr.");
    }
}

对编译后的文件再次使用strace:

$ sudo strace ./a.out 2>&1 | grep "=95"
sched_setattr(4889, {size=48, sched_policy=SCHED_FIFO, sched_flags=0, sched_nice=0, sched_priority=95, sched_runtime=0, sched_deadline=0, sched_period=0}, 0) = 0

出于某种原因,我在系统中找不到 glibc 中的系统调用或 sched.h 中的结构,因此我不得不包含结构和系统调用定义。我对此了解不多,所以这个函数可能比需要的级别低,而更高级别的调用可以更轻松地完成您想要的操作,但这恰恰反射(reflect)了 chrt 正在做的事情。

关于c++ - 如何从 C/C++ 在 Linux 中设置 IRQ 优先级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42696532/

相关文章:

c++ - 在一个非常简单的程序中检测到内存泄漏。该怎么办?

c fork,exec,getpid 问题

c - 如何在C中使用给定的FFT函数?

linux - 将 bash 脚本的结果通过管道传输到文本文件

python - 如何将二维码分割成单独的图像?

java - 如何在 C++(JNI) 中设置正在运行的 JVM 的类路径?

c++ - 使用 Python 和 C++ 进行实时处理和回调

c++ - Visual C++ 指针作用域

c - GoogleTest 在特定测试中强制 #undef

比较C中的2个子串