[英]Using signal, handler, kill, and getpid in C
我正在學習C和系統編程。 我需要創建三個信號處理程序,一旦創建它們,程序就應按以下順序將信號發送給自身:SIGUSR1,SIGUSR2和SIGINT。 下面是我的代碼。 它不起作用(例如,當我在終端中編譯時-我鍵入./prog1並單擊control-C,程序應顯示“ Caught SIGINT,Exiting”並退出。我沒有收到任何錯誤,但只返回了到下一行什么都沒有,有人可以看一下並指出我正確的方向嗎?非常感謝您的幫助!
#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;
}
您的主程序沒有等待接收信號。 發生什么情況是主程序啟動並檢查條件,並立即返回0;
為了理解
將while(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;
}
不要在信號處理程序中使用printf。 有關更多詳細信息,請參見這篇文章 。
修改后的main()
將起作用。
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()
函數添加#include <unistd.h>
。 並在其中添加%d
printf("Caught SIGSR2\n", getpid());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.