【问题标题】:Continue executing a stopped process with SIGALRM in C在 C 中使用 SIGALRM 继续执行已停止的进程
【发布时间】:2021-01-21 02:56:26
【问题描述】:

任务是继续执行我在收到 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");

【问题讨论】:

  • OT:你应该缩进你的代码
  • 而且你不能从信号处理程序中安全地调用printf()
  • 你混淆了pids。当您的父进程执行并调用kill(pid1, SIGALRM) 时,将调用信号处理程序并将SIGCONT 发送给调用它的进程,即父进程。您没有发布确切的输出,但我猜您确实看到了父级和信号处理程序的打印。我说的对吗?
  • 子进程在停止状态时无法运行 SIGALRM 处理程序。
  • SpiderPig1297 是的,我也想在输出“我在孩子”中,所以我怎样才能让 kill(pid1,SIGALRM) 向孩子发送信号

标签: c linux multithreading signals


【解决方案1】:

Re:评论中提出的问题是(“我怎样才能让 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();
        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-10
    • 2016-04-21
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多