首页 > 解决方案 > 在 C 中使用 SIGALRM 继续执行已停止的进程

问题描述

工作是继续执行我在收到 SIGALRM 信号时停止的子进程。到目前为止,我做了以下事情,这似乎不起作用:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>

void handler(int sig)
{
    printf("hello from the handler\n");
    kill(getpid(),SIGCONT);
     printf("child is continuing executing");
}

int main()
{
    int pid1=fork();
    signal(SIGALRM,handler);
    if (pid1==0) {
        kill(getpid(),SIGTSTP);
        printf(" I am in the child\n");
    } else {
        printf("i am in the parent \n");
        kill(pid1,SIGALRM);
    }
}

我尝试了许多代码变体,但printf("I am in the child");从未执行过。

标签: clinuxmultithreadingsignals

解决方案


回复:评论中提出的问题是(“我怎样才能让 kill(pid1,SIGALRM) 向孩子发送信号?”)。该调用kill(pid1,SIGALRM) 确实将信号发送给孩子,但孩子没有响应它,因为它已停止。提出的问题有些模棱两可,因为不清楚“当我收到 SIGALRM 信号时”短语中的“我”指的是谁。如果您想让孩子在孩子收到 SIGALRM 时继续,您不能。您必须先向孩子发送一个 SIGCONT,然后它才会做任何事情。如果您希望孩子在父母收到 SIGALRM 时继续,您可以这样做:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>

pid_t pid1;
void handler(int sig)
{
        (void)sig;
        if( pid1 ) {
                kill(pid1, SIGCONT);
        }
}

int main(void)
{
        signal(SIGALRM, handler);
        pid1 = fork();
        if( pid1 == 0 ) {
                kill(getpid(), SIGTSTP);
                printf("Child continued\n");
        } else {
                alarm(1);
                pause();
        }
}

推荐阅读