如何使用<signal.h>处理Ctrl + C.

时间:2016-03-19 22:29:39

标签: c signals kernel-module

我正在尝试用户级程序和内核模块之间的通信。我的用户级程序启动计时器然后进入休眠状态,并在时间结束时被内核模块唤醒,然后打印一条消息。

我遇到的问题是,当用户级程序正在休眠时,如果我Ctrl+C,当计时器到期时,它仍然会打印消息(我不希望它这样做)。这是我第一次使用<signal.h>而我无法弄清楚如何实现这一点。我发现一个网站说SIGHUP是按下Ctrl+C时发送的信号,所以我想我应该在sighandler()函数中为这个信号实现一些情况,但是我我现在很失落如何解决这个问题。以下是我到目前为止拼凑的内容:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>

void sighandler(int);

int main(int argc, char **argv) {
    char line[256];
    int lenNum, lenName;
    struct sigaction action, oa;

    int pFile, oflags;
    pFile = open("/dev/mytimer", O_RDWR);
    if (pFile < 0) {
        fprintf (stderr, "mytimer module isn't loaded\n");
        return 1;
    }

    // Setup signal handler
    memset(&action, 0, sizeof(action));
    action.sa_handler = sighandler;
    action.sa_flags = SA_SIGINFO;
    sigemptyset(&action.sa_mask);
    sigaction(SIGIO, &action, NULL);
    fcntl(pFile, F_SETOWN, getpid());  // process ID o owner saved to filp->f_owner
    oflags = fcntl(pFile, F_GETFL);
    fcntl(pFile, F_SETFL, oflags | FASYNC);  // enable asynchronous notification


    // Check if timer set
    if (argc >= 4 && strcmp(argv[1], "-s") == 0) {
        lenNum = strlen(argv[2]);
        lenName = strlen(argv[3]);
        char *ptr;
        int i;
        i = asprintf(&ptr, "%s %s %s", argv[1], argv[2], argv[3]);
        write(pFile, ptr, i+1); 
        while (read(pFile, line, strlen(line)) != 0) {  //257?
            printf("%s", line);
        }   
        free(ptr); 
        //printf("Sleep!\n");
        pause();
        printf("%s\n", argv[3]);
    }

    // List all active timers
    else if (argc == 2 && strcmp(argv[1], "-l") == 0) {
        char *ptr;
        int i;
        i = asprintf(&ptr, "%s 0", argv[1]);
        write(pFile, ptr, i);
        while (read(pFile, line, strlen(line)) != 0) {
            printf("%s", line);
        }
        free(ptr);
    }
    close(pFile);
    return 0;
    }

    // SIGIO handler
    void sighandler(int signo) {
        //printf("Awaken!\n");
        /* maybe something like this?
        if (signo == SIGHUP) {
            // clear timer
        } */
     }

非常感谢任何建议。

0 个答案:

没有答案