4

SIGINT および SIGQUIT シグナルを無視して SIGTERM を終了するプロセスを C/Linux で作成しようとしています。他のシグナルについては、シグナルと時間を書き出す必要があります。私は 1 つのシグナルしかキャッチできないので、すべてのシグナルをキャッチするのに苦労しています。誰かがこれで私を助けてくれたら、とても感謝しています。これが私のコードです:

#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>

int done = 0;

void term(int signum)
{
    if (signum == 15)
    {   
        //printf("%d\n",signum);        
        printf("Received SIGTERM, exiting ... \n");
        done  = 1;
    }
    else
    {
        time_t mytime = time(0);
        printf("%d: %s\n", signum, asctime(localtime(&mytime)));
        printf("%d\n",signum);
    }
}

int main(int argc, char *argv[])
{
    struct sigaction action;
    memset(&action, 0, sizeof(struct sigaction));
    action.sa_handler = term;
    sigaction(SIGTERM, &action, NULL);
    struct sigaction act;
    memset(&act, 0, sizeof(struct sigaction));
    act.sa_handler = SIG_IGN;
    sigaction(SIGQUIT, &act, NULL);
    sigaction(SIGINT, &act, NULL);

    int loop = 0;
    while(!done)
    {
        sleep(1);
    }

    printf("done.\n");
    return 0;
}
4

1 に答える 1

2

これが簡単な方法です

void sig_handler(int signo)
{
  if (signo == SIGINT)
    printf("received SIGINT\n");
}   

int main(void)
{
       if (signal(SIGINT, sig_handler) == SIG_ERR)

等々。

signal() と sighandler() は、これを行うための最も簡単な方法です。

キャッチしたいシグナルごとにシグナルを呼び出します。しかし、先に述べたように、特定のシグナルしかキャッチできません。プログラムを正常にシャットダウンする方法を用意することをお勧めします。

于 2016-02-06T17:36:34.130 に答える