簡體   English   中英

在C中使用signal,handler,kill和getpid

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM