如何在 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() 时,计时代码起作用了!但是,整个代码实际上并没有,因为调用重新启用中断,使该工具无用。因此使用了一个简单的延迟循环。