如何在 XXX 毫秒内阻止 Linux 机器上的所有其他进程?
How do I block all other processes on a Linux machine for XXX milliseconds?
我正在使用 Linux 嵌入式 SMP 系统,该系统使用 ALSA 和外部 USB 音频设备处理音频 I/O,使用 3.6.6。核心。问题:我很少(每隔几周一次)系统故障导致音频流中断。尽管很难确定,但打嗝看起来像是将整个系统锁定了几十毫秒。
我可以编写 ALSA 代码来在这些问题之一之后恢复,但由于它是 ALSA,因此需要反复试验。再加上必须等待数周才能再次发生,我会带着撬棍爬上小溪。我真的需要一种方法来按需引起问题。
我想编写一个 C 程序,以 root 身份运行并在给定的毫秒数内阻塞系统上的所有其他进程。我想这将涉及禁用中断,执行延迟循环(因为计时器可能会失败),然后恢复中断。但是,我必须以整个系统不会崩溃的方式来做。
关于如何编写这样的程序有什么想法吗?
您可以尝试提高进程的优先级,然后使用 "realtime" 调度算法之一(例如 SCHED_FIFO)。这将有助于确保您的流程得到更一致的安排,即使其他流程是 运行.
嗯,基于CL's tip, and on information from http://www.tldp.org/HOWTO/text/IO-Port-Programming,我写了如下代码:
#include <stdio.h>
int main(int argc, char *argv[]) {
long i, j;
printf("About to lock system!\n");
// Boost I/O privilege level
iopl(3);
// Clear interrupt flag, masking interrupts
asm("cli");
// Wait about a second (with some hijinks to keep
// the loop from being optimized into oblivion)
j = 1;
for (i = 0; i < 250000000; i++) {
j *= i;
}
// Restore interrupt flag, restoring interrupts
asm("sti");
// Restore I/O privilege level
iopl(0);
printf("Phew! Survived!\n");
return 0;
}
当 运行 作为 root 时,它有效!虽然不是所有的东西都被挂起(我不清楚什么是什么不是),但足够多的锁定使我的 ALSA 流非常好地失败。所以,现在我可以激发问题并确保我的代码可以处理它。
注意事项:我假设在 CLI 和 STI 之间,系统计时例程会由于缺少中断而失败。然而,当我尝试使用 usleep() 时,计时代码起作用了!但是,整个代码实际上并没有,因为调用重新启用中断,使该工具无用。因此使用了一个简单的延迟循环。
我正在使用 Linux 嵌入式 SMP 系统,该系统使用 ALSA 和外部 USB 音频设备处理音频 I/O,使用 3.6.6。核心。问题:我很少(每隔几周一次)系统故障导致音频流中断。尽管很难确定,但打嗝看起来像是将整个系统锁定了几十毫秒。
我可以编写 ALSA 代码来在这些问题之一之后恢复,但由于它是 ALSA,因此需要反复试验。再加上必须等待数周才能再次发生,我会带着撬棍爬上小溪。我真的需要一种方法来按需引起问题。
我想编写一个 C 程序,以 root 身份运行并在给定的毫秒数内阻塞系统上的所有其他进程。我想这将涉及禁用中断,执行延迟循环(因为计时器可能会失败),然后恢复中断。但是,我必须以整个系统不会崩溃的方式来做。
关于如何编写这样的程序有什么想法吗?
您可以尝试提高进程的优先级,然后使用 "realtime" 调度算法之一(例如 SCHED_FIFO)。这将有助于确保您的流程得到更一致的安排,即使其他流程是 运行.
嗯,基于CL's tip, and on information from http://www.tldp.org/HOWTO/text/IO-Port-Programming,我写了如下代码:
#include <stdio.h>
int main(int argc, char *argv[]) {
long i, j;
printf("About to lock system!\n");
// Boost I/O privilege level
iopl(3);
// Clear interrupt flag, masking interrupts
asm("cli");
// Wait about a second (with some hijinks to keep
// the loop from being optimized into oblivion)
j = 1;
for (i = 0; i < 250000000; i++) {
j *= i;
}
// Restore interrupt flag, restoring interrupts
asm("sti");
// Restore I/O privilege level
iopl(0);
printf("Phew! Survived!\n");
return 0;
}
当 运行 作为 root 时,它有效!虽然不是所有的东西都被挂起(我不清楚什么是什么不是),但足够多的锁定使我的 ALSA 流非常好地失败。所以,现在我可以激发问题并确保我的代码可以处理它。
注意事项:我假设在 CLI 和 STI 之间,系统计时例程会由于缺少中断而失败。然而,当我尝试使用 usleep() 时,计时代码起作用了!但是,整个代码实际上并没有,因为调用重新启用中断,使该工具无用。因此使用了一个简单的延迟循环。