簡體   English   中英

父進程正在向子進程發出信號,但是需要改進子進程的信號處理

[英]Parent process is firing signals at a child process but the child's signal handling needs to be improved

我正在為考試准備一些練習題,其中一個題為兩段代碼,稱為parent.c和child.c。 父級創建一個子級並向其發射信號,並且子級每次收到信號時都會顯示一條消息。 兒童將花費剩余的時間從主打印消息。 問題是描述child.c中的信號處理出了什么問題,並重新編寫代碼以對其進行更正。 我對信號有一個大致的了解,但是在實現它們方面有很多困難。 我不確定child.c中的procmask是否能正常工作,我對信號不完全滿意,但是我看不到為什么將NULL作為最后一個參數,所以這也許是錯誤原因的一部分? 有人可以指出正確的方向,讓我知道代碼的哪一部分是錯誤的,為什么。

父母

#include <unistd.h>
#include <signal.h>
int
main(int argc, char *argv[])
{
    pid_t pid;
    sigset_t set;

    sigemptyset(&set);

    sigaddset(&set, SIGUSR1);

    sigprocmask(SIG_BLOCK, &set, NULL);

    pid = fork();

    if (pid == 0) {
        execlp("./child", "./child", NULL);
    }

    while (1) {
        kill(pid, SIGUSR1);
    }

    return (0);
}

兒童

#define _XOPEN_SOURCE 500

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

static void
handler(int signo)
{
    printf("This is the SIGUSR1 signal handler!\n");
}

int
main(void)
{
    sigset_t set;

    sigemptyset(&set);

    sigset(SIGUSR1, handler);

    sigprocmask(SIG_SETMASK, &set, NULL);

    while (1) {
        printf("This is main()!\n");
    }

    return (0);
}
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

最后一個參數用於存儲舊的信號掩碼。 如果為NULL ,則意味着我們不需要存儲舊的信號掩碼。

請注意,您不應在信號處理程序中使用printf ,因為它不會重入,請參閱如何避免在信號處理程序中使用printf?

execlp的用法是錯誤的,因為NULL可以定義為0 ,並且編譯器可能認為它是整數,而不是null指針。

execlp("./child", "./child", NULL);

最后一個參數應為(char *)0 ,如下所示:

execlp("./child", (char *)0);

正如man sigset所述, sigset已過時,您應該使用sigaction 是有關如何使用它的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM