现在,我正在使用chrt
(对于给定的irqPid)在实时Linux中设置IRQ优先级:
/usr/bin/chrt -f -p 95 irqPid
是否有一种方式/一些功能从C/C++中运行(除了运行
system()
执行上面的命令)? 最佳答案
你可能想要sched_setattr。使用strace查看syscall 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中找不到syscall,在系统上找不到sched.h中的结构,因此我必须包含结构和syscall定义。我对此了解不多,所以这个函数的级别可能比需要的低,而更高级别的调用可以更容易地执行您想要的操作,但这恰恰反映了chrt正在执行的操作。
关于c++ - 如何从C/C++在Linux中设置IRQ优先级?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42696532/