如何在linux中重复一个进程(或设置一个进程周期)
How to repeat a process ( or to set a period of process) in linux?
我有一个过程要做一些事情,需要在1ms后重复。如何在linux上设置进程的周期?
我在英特尔i7-2600 CPU(总共8核)上使用linux 3.2.0-4-rt-amd64(带有rt Preempt补丁)@3.40 Ghz。基本上,我在代码中显示的while循环中有大约6个线程,我希望线程每1毫秒执行一次。最后,我想测量每个线程的延迟。
那么如何设置1ms的周期呢?
例如,在下面的代码中,如何在每1ms后重复Task1?
while(1){
//Task1(having threads)
}
谢谢。
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);
}
读取时间(7)。
一毫秒实际上是一小段时间。(你不能忍受例如十毫秒的延迟吗?)。我不确定普通笔记本电脑硬件上的常规Linux上的常规进程是否能够在这么短的时间内可靠地处理。也许您需要RTLinux,或者至少需要实时调度(请参阅sched_setscheduler(2)和这个问题),也许还需要一个经过特殊配置的最新3.x内核
您不能确定您的处理(在循环内)是否小于一毫秒。
您应该解释应用程序在做什么,以及循环内部发生了什么。
您可能有一些事件循环,可以考虑使用ppoll(2)、timer_create(2)(另请参阅timer_getoverride(2…)和/或timerfd_create(2)和clock_nanosleep(2)
(我会尝试使用ppoll
和timerfd_create
,但我会接受跳过一些毫秒刻度)
您应该告诉我们更多关于您的硬件和内核的信息。我甚至不确定我的台式机i3770K处理器,asus P8Z77V主板(3.13.3PREEMPT
Linux内核)是否能够可靠地处理单毫秒延迟。
(当然,一个简单调用clock_nanosleep
的普通循环,或者更好的是,将timerfd_create
与ppoll
一起使用,通常会完成这项工作。但这不是可靠的…)
- 如何在C++中将函数发送到另一个进程
- 如何从另一个进程解开全局钩子?
- 如何使用带有矢量的 winapi 读取进程内存从另一个进程读取缓冲区?
- 为什么一个进程会挂在RtlExitUserProcess/LdrpDrainWorkQueue中?
- 先进先出:一个进程永远不会从管道读取
- 如何在MPI中将矩阵从一个进程转移到另一个进程
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- 带有 QSharedMemory 的 IPC,如果其中一个进程挂起,则存在风险
- 通过 c++ 中的 udp 套接字将派生类对象从一个进程发送到另一个进程
- 如何:监视Windows中另一个进程的文件访问?
- 是否可以注入一个进程并获取给定的句柄,然后使用它们注入另一个进程
- 尝试启动另一个进程并通过 MPI 加入它,但获得访问冲突
- 将窗口句柄从一个进程使用到另一个进程(插件 vst 音频)
- 启动另一个进程的最佳方式C++?
- 在 Linux 下的 Qt,如何检测一个进程已经在运行
- 当一个进程截断 Boost 进程间库创建的共享内存时,进程需要重新映射
- Win32/Gdigrab - 如何将另一个进程窗口设置为无边框
- 为什么我不能用这个函数在Qt框架中打开另一个进程?
- 创建一个进程,指定要在其上运行的 NUMA 节点
- 多次运行程序,同时保留一个进程