2

我是 C 和系统编程的初学者。我写了一个程序,它应该显示以下内容: Caught SIGUSR1 Caught SIGUSR2 Caught SIGINT

但是,当我执行“./test.c”时,当我键入 Ctrl-C 时,我看到的唯一内容是“Caught SIGINT”。如何修复我的代码,以便我的程序显示上面的消息?对不起,如果我的问题很愚蠢。非常感谢您的帮助。谢谢阅读。

编辑:

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

static void sigHandler_sigusr1(int sig)
{
    //sig contains the signal number that was received
    printf("Caught SIGUSR1, %d\n", getpid());
    //kill(getpid(), SIGUSR1);
}

static void sigHandler_sigusr2(int sig)
{
    //sig contains the signal number that was received
    printf("Caught SIGSR2, %d\n", getpid());
    //kill(getpid(), SIGUSR2);
}

static void sigHandler_sigint(int sig)
{
    //sig contains the signal number that was received
    printf("Caught SIGINT, Existing, %d\n", getpid());
    //kill(getpid(), SIGINT);
    exit(EXIT_SUCCESS);
}

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

    if (signal(SIGUSR1, sigHandler_sigusr1) == SIG_ERR)
        printf("Unable to create handler for SIGUSR1\n");

    if (signal(SIGUSR2, sigHandler_sigusr2) == SIG_ERR)
        printf("Unable to create handler for SIGUSR2\n");

    if (signal(SIGINT, sigHandler_sigint) == SIG_ERR)
        printf("Unable to create handler for SIGINT\n");

    kill(getpid(), SIGUSR1);
    kill(getpid(), SIGUSR2);
    kill(getpid(), SIGINT);

    while (1)
    {
        sleep(1);
    }

    return 0;
}
4

3 回答 3

2

为了激活信号处理函数,您需要向进程发送信号。您的代码中缺少它。

这是您向自己发送信号的方式:

kill(getpid(), SIGUSR1);

您需要为SIGUSR1和执行此操作SIGUSR2

您可以看到SIGINT消息的原因是,当您按下时,ctrl+c您实际上向SIGINT您的进程发送了一个信号。

于 2013-07-17T14:44:40.850 回答
1

我可能是错的,但SIGUSR1并且SIGUSR2是用户指定的信号。

当您执行“Ctrl-C”时,您会执行中断,由SIGINT处理程序捕获。

为了抓住SIGUSR1SIGUSR2必须自己扔它们:

kill(pid, SIGUSR1);

更多信息

于 2013-07-17T14:44:23.763 回答
1

这一切看起来都不错。

使用 SIGUSR,您必须在程序中显式调用它们。您不能使用 ctrl-z 或 ctrl-c 触发它们。

您没有在尝试触发信号的位置显示任何代码。

于 2013-07-17T14:44:49.950 回答