操作系统中的信号问题

时间:2014-01-06 12:48:09

标签: c signals

我有这个项目,它的价值是整体成绩的20%,因为我在医院,我有点缺席。我对完全失去的信号一无所知。该项目是:

要求您编写一个程序,该程序接受一个参数,一个文本文件名,并计算此文件中指定单词的实例。你要计算五个字的计数:

  1. “a”
  2. “一个”
  3. “该”
  4. “是”
  5. “是”
  6. 对于这个项目,比文本处理更重要的是处理信号。在文件处理期间(可能持续几秒钟),程序应输出每2秒处理一次的当前行号。这可以通过定义自己的SIGALRM处理程序来完成,该处理程序还需要安排下一个警报。每2秒调用一次警报处理程序,并显示当前行号。出于测试目的,您需要使用非常大的文本文件,因为输入文件很小,您的程序甚至会在收到第一个警报信号之前终止。

    此外,您的程序应该处理键盘中断产生的信号。当按下 Ctrl + C 时,您的程序应该询问用户是否要退出,而不是默认终止该过程。用户可以输入“y”或“n”字符。如果用户选择“y”,那么您的程序应该打印到目前为止的统计信息并退出。否则它应该继续运行。 当按下 Ctrl + Z 时,您的程序应该打印到目前为止的统计数据并继续计数。

    确保提供带有适当缩进和文档的C文件。

    单词的计数非常简单,但关键是我在信号中丢失了,请你帮助我

2 个答案:

答案 0 :(得分:0)

这是一个示例,显示如何捕获在终端中按下 CTRL + C 时将发送的SIGINT。

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

int current_signal = -1;

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

int main(void)
{
    if (signal(SIGINT, sig_handler) == SIG_ERR)
        printf("Error when setting up SIGINT handler\n");

    while(1)
    {
        if(current_signal == SIGINT)
            break;

        sleep(1);
    }

    return 0;
}

答案 1 :(得分:0)

下面是使用sigaction结构的Ctrl + C(SIGINT)示例。您可以在sigaction手册页中找到更多详细信息。

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

int done = 0;

void sigint_handler(int signum) {
     printf("A SIGINT was sended, exiting...\n");
     done = 1;
}

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

     int line = 0; 
     while (!done)
     {
          sleep(2);
          printf("Finished line number %d.\n", line++);
     }

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