Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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/23.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
C Linux实时编程_C_Linux_Kernel_Real Time_Hard Real Time - Fatal编程技术网

C Linux实时编程

C Linux实时编程,c,linux,kernel,real-time,hard-real-time,C,Linux,Kernel,Real Time,Hard Real Time,我刚刚构建并设置了一个香草Linux内核,并应用了RT补丁。一切都很顺利,我现在可以正确地引导到新内核中 让我疑惑的是:我有一个用C语言编写的模拟器程序,我希望它能在硬实时模式下执行,这是新内核应该允许的。也许整个模拟器不需要以实时优先级运行,但是其中的一些任务可以 我怎样才能做到这一点?我认为简单地运行程序是不行的。如果您询问如何在实时上下文中运行一些线程,以及如何将其他线程作为传统的分时线程运行,那么您所需要的就是设置它们的线程 分时线程希望成为SCHED_OTHER;实时模拟器线程希望是S

我刚刚构建并设置了一个香草Linux内核,并应用了RT补丁。一切都很顺利,我现在可以正确地引导到新内核中

让我疑惑的是:我有一个用C语言编写的模拟器程序,我希望它能在硬实时模式下执行,这是新内核应该允许的。也许整个模拟器不需要以实时优先级运行,但是其中的一些任务可以


我怎样才能做到这一点?我认为简单地运行程序是不行的。

如果您询问如何在实时上下文中运行一些线程,以及如何将其他线程作为传统的分时线程运行,那么您所需要的就是设置它们的线程

分时线程希望成为
SCHED_OTHER
;实时模拟器线程希望是
SCHED_FIFO
SCHED_RR

在Linux上,为了以实时优先级运行,您的用户必须具有允许此操作的资源限制()。特别是,必须将
rtprio
rlimit设置为所需的最高优先级。或者,您可以以root用户身份运行应用程序。在使用PAM的linux系统中,这通常是通过在
/etc/security/limits.conf

@realtime - rtprio 99 @实时-rtprio 99 这将向实时组授予实时优先级高达99的rtprio限制。然后将实时组添加到
/etc/groups
,并确保您的用户在该组中


(由于这似乎是您第一次这样做,您可能还需要一个“死人开关”高优先级实时线程,以确保模拟器不会失控并导致系统无法使用……如果模拟高CPU负载,可能会导致实际高CPU负载,并且在不重新启动的情况下无法停止。)

是否应该Alt+SysRq+N将所有实时进程重置为正常模式?@Victor:我以前没有使用过该功能,也不知道该如何依赖它。看起来它用于重新冻结所有内容并删除所有rt优先级,但不知道这样做后如何恢复到正常优先级状态。假设我在一个新的分叉进程中调用了此命令:sched_setscheduler(getpid(),sched_FIFO,&sp);为什么这不能正确地被排除?sched_setscheduler返回1而不是0,我很确定sp配置正确(sp.sched_优先级设置为98)。您可能没有调用set_scheduler的权限。你是以root用户身份运行吗?如果这可以解决问题,那么正确的做法是建立一个允许执行实时操作的组,并将其放入limits.conf文件中。这里有一个简单的例子:Ubuntu 16.04上
limits.conf
的路径是
/etc/security/limits.conf
(注意添加的
security
目录)