如何在linux中重复一个进程(或设置一段进程)?

时间:2014-02-19 17:00:40

标签: c++ linux timer clock

我有一个过程可以做一些事情,需要在1ms后重复。如何在linux上设置进程的周期?

我在Intel i7 -2600 CPU(总共8个核心)@ 3.40 Ghz上使用linux 3.2.0-4-rt-amd64(带RT-Preempt补丁)。 基本上我在代码中显示的while循环中有大约6个线程,我希望线程每1毫秒执行一次。最后,我想测量每个线程的延迟。

那么如何设置1ms的周期?

例如在下面的代码中,如何在每1ms之后重复Task1?

while(1){

   //Task1(having threads)

}

谢谢。

2 个答案:

答案 0 :(得分:0)

阅读time(7)

一毫秒真的是很短的一段时间。 (你不能承受例如10毫秒的延迟吗?)。我不确定普通笔记本电脑硬件上普通Linux上的常规流程是否能够在如此短的时间内可靠地处理 。也许您需要RTLinux或至少需要实时调度(请参阅sched_setscheduler(2)this question)以及可能是特别配置的最新3.x内核

您无法确定您的处理(在循环内)是否小于毫秒。

您应该解释您的应用程序正在做什么,以及循环内部发生了什么。

您可能有一些事件循环,请考虑使用ppoll(2)timer_create(2)(另请参阅timer_getoverrun(2) ...)和/或timerfd_create(2)clock_nanosleep(2) < / p>

(我会尝试使用ppolltimerfd_create,但我会接受一些毫秒的刻度来跳过)

您应该告诉我们有关您的硬件和内核的更多信息。我甚至不确定我的台式机i3770K处理器,华硕P8Z77V主板(3.13.3 PREEMPT Linux内核)是否能够可靠地处理一毫秒的延迟。

(当然,只需调用clock_nanosleep的简单循环,或者更好,使用timerfd_create ppoll通常会完成工作。但是不是可靠 ...)

答案 1 :(得分:0)

在while循环中调用usleep(1000)将完成这项工作,即:

while (1) {
    // Task1
    usleep(1000); // 1000 microseconds = 1 millisecond
}

修改

由于usleep()已被弃用,而不是nanosleep(),我们改用后者:

struct timespec timer;
timer.tv_sec = 0;
timer.tv_nsec = 1000000L;

while (1) {
    // Task1
    nanosleep(&timer, NULL);
}