使用信号从睡眠中唤醒进程

Posted

技术标签:

【中文标题】使用信号从睡眠中唤醒进程【英文标题】:Wake up a process from sleep with a signal 【发布时间】:2021-04-10 13:29:36 【问题描述】:

我让一个进程进入休眠状态。当一个进程进入睡眠状态时,它被标记为处于特殊状态并从调度程序的运行队列中删除,我想通过命令行发送信号来唤醒它,我该怎么做。假设我有这个使用sleep 100 秒的C 代码。

我需要发送什么信号才能唤醒它并使返回值成为从睡眠中剩余的秒数?

#include <unistd.h>
#include <stdio.h>

int main(void)

    printf("Current Proc ID is: %d. Wake me Up!\n", getpid());

    int time_remain = sleep(100);
    printf("Time Remain of sleep: %d\n", time_remain);
    return 0;

【问题讨论】:

这能回答你的问题吗? ***.com/questions/61494611/… 阅读time(7) 和signal(7)。你的方法不是最好的。也许使用ppoll(2) 您需要设置一个信号来处置SIG_IGN,然后发送该信号。 看起来 SIGCONT 可以做到 (kill -CONT PID) — unix.stackexchange.com/questions/252507/… 我也尝试过SIGURGSIGCHLD,因为它们的默认配置是SIG_IGN,但它们也不起作用。因此,您可能需要为信号建立一个实际的处理程序。 【参考方案1】:

将信号处理程序分配给信号,然后发送该信号。

#include <unistd.h> // sleep
#include <stdio.h>
#include <signal.h>

void do_nothing(int ignore) 


int main(void)

    signal(SIGUSR1, do_nothing);
    printf("Remaining = %d\n", sleep(100)); // i.e the return value after 5 seconds will be 95
    return 0;

imac:barmar $ ./testsleep &
[1] 2179
imac:barmar $ kill -USR1 %1
Remaining = 95
[1]+  Done                    ./testsleep

【讨论】:

这里不是有点复杂吗?我的意思是,可能有唤醒进程的信号。还是谢谢你 AFAIK 没有这样的信号。

以上是关于使用信号从睡眠中唤醒进程的主要内容,如果未能解决你的问题,请参考以下文章

linux 内核睡眠与唤醒

Linux进程的睡眠和唤醒

调用睡眠的程序不会在信号上唤醒

Linux进程状态详解及状态转换

ubuntu 进程睡眠怎么唤醒

11 linux011用于进程共享资源的睡眠与唤醒