C程序-发送SIGTERM信号后进程未调用

问题描述 投票:0回答:1

我是在C编程中使用信号的新手。

为了演示我的问题,我编写了两个简单的源代码child.c和parent.c。

child.c

void errorHandler(char* message);
void sigterm_handler(int signum, siginfo_t* info, void* ptr);

int main(){

    struct sigaction action1;
    memset(&action1, 0, sizeof(action1));
    action1.sa_sigaction = sigterm_handler;
    action1.sa_flags = SA_SIGINFO;

    if(sigaction(SIGTERM, &action1, NULL) != 0)
        errorHandler("Signal sigterm_handler registration failed");

    for(int i = 0; i < 10; i++){

        printf("%d\n", i);
        if(i == 5){

            if(raise(SIGSTOP)!= 0)
                errorHandler("Raise SIGSTOP failed");
        }
    }

    return EXIT_SUCCESS;
}

void errorHandler(char* message){

    printf("Error: %s: %s\n", message, strerror(errno));
    exit(EXIT_FAILURE);
}

void sigterm_handler(int signum, siginfo_t* info, void* ptr){

    printf("Child: Process %d finishes\n", getpid());
    exit(EXIT_SUCCESS);
}

parent.c

int main(int argc, char* argv[]){

    int status;
    pid_t mem;
    pid_t child = fork();

    if(child == 0){

        char* arr[] = {"./child", NULL};
        execv(arr[0], arr);
    }

    else if(child > 0){

        mem = child;
        waitpid(mem, &status, WUNTRACED);
    }

    if(WSTOPSIG(status)){

        printf("Sending SIGTERM to child\n");
        kill(mem, SIGTERM);
        waitpid(mem, &status, 0);
    }

    return 0;
}

当我运行parent.c时,程序将打印到stdout中:

1
2
3
4
5
Sending SIGTERM to child

但是程序被卡住了,可能是因为sigterm_handler不调用,而不是打印“ Child:Process *** finishs”。

我试图在linux手册页上阅读,但仍然无法弄清。

任何人都可以向我解释是什么导致了此问题?

任何答案将不胜感激!

c signals fork wait
1个回答
0
投票

问题是子进程调用了

if(raise(SIGSTOP) != 0)

仍然停止,当父母在这里

kill(mem, SIGTERM);

发送信号SIGTERM。信号不会丢失,但仍会在孩子的过程中挂起,并且会在过程继续运行时立即发送。您可以通过发出

实现
kill(mem, SIGCONT);

发送SIGTERM后直接发送。然后,孩子将继续运行,将发出信号并执行处理程序,打印诊断消息并退出过程。

© www.soinside.com 2019 - 2024. All rights reserved.