在C中使用signal、handler、kill和getpid
我正在学习C语言和系统编程。我需要创建三个信号处理程序,一旦它们被创建,程序应该按照以下顺序向自身发送信号:SIGUSR1、SIGUSR2和SIGINT。下面是我的代码。它不工作(例如,当我在terminal-I-type./prog1中编译并单击control-C时,程序应该打印“捕获信号,退出”并退出。我没有收到任何错误,但它只是返回到下一行,没有任何内容。有人可以看一下并为我指出正确的方向吗?非常感谢您的帮助在C中使用signal、handler、kill和getpid,c,signals,kill,C,Signals,Kill,我正在学习C语言和系统编程。我需要创建三个信号处理程序,一旦它们被创建,程序应该按照以下顺序向自身发送信号:SIGUSR1、SIGUSR2和SIGINT。下面是我的代码。它不工作(例如,当我在terminal-I-type./prog1中编译并单击control-C时,程序应该打印“捕获信号,退出”并退出。我没有收到任何错误,但它只是返回到下一行,没有任何内容。有人可以看一下并为我指出正确的方向吗?非常感谢您的帮助 #include <signal.h> #include <s
#include <signal.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
static void sigHandler_sigusr1(int sig)
{
//sig contains the signal number that was received
printf("Caught SIGUSR1\n", getpid());
kill(getpid(), SIGUSR1);
}
static void sigHandler_sigusr2(int sig)
{
//sig contains the signal number that was received
printf("Caught SIGSR2\n", getpid());
kill(getpid(), SIGUSR2);
}
static void sigHandler_sigint(int sig)
{
//sig contains the signal number that was received
printf("Caught SIGINT, Exiting\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 SIGUSR1\n");
return 0;
}
#包括
#包括
#包括
#包括
#包括
静态无效信号发生器1(内部信号)
{
//sig包含接收到的信号号
printf(“捕获的SIGUSR1\n”,getpid());
kill(getpid(),SIGUSR1);
}
静态无效信号发生器2(内部信号)
{
//sig包含接收到的信号号
printf(“捕获的SIGSR2\n”,getpid());
kill(getpid(),SIGUSR2);
}
静态无效信号发生器(信号发生器)
{
//sig包含接收到的信号号
printf(“捕获信号,正在退出”,getpid());
kill(getpid(),SIGINT);
退出(退出成功);
}
int main(int argc,char*argv[])
{
if(信号(SIGUSR1,sigHandler_SIGUSR1)=SIG_ERR)
printf(“无法为SIGUSR1创建处理程序\n”);
如果(信号(SIGUSR2,sigHandler_SIGUSR2)=SIG_ERR)
printf(“无法为SIGUSR2创建处理程序\n”);
中频(信号(SIGINT,sigHandler\u SIGINT)=SIG\u ERR)
printf(“无法为SIGUSR1创建处理程序\n”);
返回0;
}
您的主程序没有等待接收信号。发生的情况是主程序启动并检查条件是否正确,然后立即返回0
为了理解
在主程序中括起(1)
,现在点击ctr+C。您将获得预期的输出
#include <signal.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
static void sigHandler_sigusr1(int sig)
{
//sig contains the signal number that was received
printf("Caught SIGUSR1\n");
kill(getpid(), SIGUSR1);
}
static void sigHandler_sigusr2(int sig)
{
//sig contains the signal number that was received
printf("Caught SIGSR2\n");
kill(getpid(), SIGUSR2);
}
static void sigHandler_sigint(int sig)
{
//sig contains the signal number that was received
printf("Caught SIGINT, Existing\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 SIGUSR1\n");
while(1){
/*some work*/
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
静态无效信号发生器1(内部信号)
{
//sig包含接收到的信号号
printf(“捕获信号1\n”);
kill(getpid(),SIGUSR1);
}
静态无效信号发生器2(内部信号)
{
//sig包含接收到的信号号
printf(“捕获的SIGSR2\n”);
kill(getpid(),SIGUSR2);
}
静态无效信号发生器(信号发生器)
{
//sig包含接收到的信号号
printf(“捕获的SIGINT,现有的”,getpid());
kill(getpid(),SIGINT);
退出(退出成功);
}
int main(int argc,char*argv[])
{
if(信号(SIGUSR1,sigHandler_SIGUSR1)=SIG_ERR)
printf(“无法为SIGUSR1创建处理程序\n”);
如果(信号(SIGUSR2,sigHandler_SIGUSR2)=SIG_ERR)
printf(“无法为SIGUSR2创建处理程序\n”);
中频(信号(SIGINT,sigHandler\u SIGINT)=SIG\u ERR)
printf(“无法为SIGUSR1创建处理程序\n”);
而(1){
/*一些工作*/
}
返回0;
}
不要在信号处理程序中使用printf。有关详细信息,请参阅。Modifiedmain()
将起作用
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 SIGUSR1\n");
while(1)
{
sleep(1);
}
return 0;
}
在代码中,注册信号处理程序后,执行完成。while(1)
被添加以保持代码运行,因此当按下CTRL+C
时,将调用处理程序
同时为getpid()
函数添加#包括,并在中添加%d
printf("Caught SIGSR2\n", getpid());
您是否尝试在返回之前放置一段时间(1)?并添加%d以打印getpid()。“…程序应按以下顺序向自身发送信号:…”要使其像main()
那样执行,应采取措施启动此操作,但目前它没有。