0

我正在为考试做一些练习题,其中一个问题给出了两段代码,称为 parent.c 和 child.c 。父母创建一个孩子并向其发射信号,孩子每次收到信号时都会显示一条消息。孩子将花费剩下的时间打印来自 main 的消息。问题是描述 child.c 中的信号处理有什么问题,并重新编写代码来纠正它。我对信号有了大致的了解,但在实现它们时遇到了很多困难。我不确定procmask在 child.c 中是否正常工作,我对信号并不完全满意,但我不明白你为什么要把NULL它作为最后一个参数,所以也许这就是它的部分原因 错了吗?有人可以指出我正确的方向,并告诉我代码的哪一部分是错误的以及为什么。

父.c

#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);
}

孩子.c

#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);
}
4

2 回答 2

0

由于man sigsetstatessigset已过时,您应该使用sigaction. 是一个关于如何使用它的例子。

于 2013-08-05T14:07:43.417 回答
0
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

最后一个参数用于存储旧信号掩码。当它是 时NULL,这意味着我们不需要存储旧的信号掩码。

请注意,您不应该printf在信号处理程序中使用,因为它不是可重入的,请参阅如何避免在信号处理程序中使用 printf?

的用法execlp是错误的,因为NULL可以定义为0,编译器可能会认为它是一个整数,而不是空指针。

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

最后一个参数应该是(char *)0,像这样:

execlp("./child", (char *)0);
于 2013-08-05T11:59:38.170 回答