我是C和系统编程的初学者。我写了一个程序,它应该显示以下内容: 抓住了SIGUSR1 抓住了SIGUSR2 抓住了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;
}
答案 0 :(得分:2)
为了激活信号处理函数,您需要向procces发送信号。 您的代码中缺少它。
这是你向自己发送信号的方式:
kill(getpid(), SIGUSR1);
您需要为SIGUSR1
和SIGUSR2
执行此操作。
您可以看到SIGINT
消息的原因是,当您按ctrl+c
时,实际上会向您的代理发送SIGINT
信号。
答案 1 :(得分:1)
我可能错了,但SIGUSR1
和SIGUSR2
是用户指定的信号。
执行“Ctrl-C”时,会执行由SIGINT
处理程序捕获的中断。
为了抓住SIGUSR1
ans SIGUSR2
,你必须自己抛出它们:
kill(pid, SIGUSR1);
答案 2 :(得分:1)
一切看起来都不错。
使用SIGUSR,你必须在程序中明确地调用它们。您无法使用ctrl-z或ctrl-c触发它们。
您没有显示尝试触发信号的任何代码。