首页 > 解决方案 > “I/O 块状态”和“睡眠”有区别吗?

问题描述

SIGCONT 可以唤醒休眠的进程吗?

前天我了解到,信号处理程序使进程的“睡眠”失败。

同样,我尝试使用信号处理程序使“读取”失败。

代码如下。

#include <signal.h>
#include <unistd.h>

void signal_handler(int signo)
{
        write(1, "\nI've got signal\n", 17);
        return;
}

int main()
{
        char buf[10];

        signal(SIGINT, signal_handler);

        read(0, buf, 1);

        write(1, buf, 1);

        return 0;
}

但是,在执行信号处理程序后,进程又回到 I/O 块状态。

还执行了以下代码以进行重新验证。

#include <signal.h>
#include <unistd.h>

void signal_handler(int signo)
{
        write(1, "\nI've got signal\n", 17);
        return;
}

int main()
{
        char buf[10];

        signal(SIGINT, signal_handler);

        sleep(100);

        write(1, "awake", 5);

        return 0;
}

在这种情况下,在收到信号处理程序后,进程不再处于睡眠状态。

有没有办法在收到信号后退出阻塞状态,继续这个过程?(输入失败)

标签: clinuxprocessiooperating-system

解决方案


根据signal()函数的文档:

signal() 的行为因 UNIX 版本而异,并且在历史上因 Linux 的不同版本而异。避免使用它:使用 sigaction(2) 代替。请参阅下面的可移植性。

...

可移植性

   The only portable use of signal() is to set a signal's disposition to
   SIG_DFL or SIG_IGN.  The semantics when using signal() to establish a
   signal handler vary across systems (and POSIX.1 explicitly permits
   this variation); do not use it for this purpose.

因此,您应该使用sigaction()而不是 signal()。

如果您在程序中将 signal() 替换为 sigaction() ,它应该可以按预期工作。


推荐阅读