我有这个项目,它的价值是整体成绩的20%,因为我在医院,我有点缺席。我对完全失去的信号一无所知。该项目是:
要求您编写一个程序,该程序接受一个参数,一个文本文件名,并计算此文件中指定单词的实例。你要计算五个字的计数:
对于这个项目,比文本处理更重要的是处理信号。在文件处理期间(可能持续几秒钟),程序应输出每2秒处理一次的当前行号。这可以通过定义自己的SIGALRM处理程序来完成,该处理程序还需要安排下一个警报。每2秒调用一次警报处理程序,并显示当前行号。出于测试目的,您需要使用非常大的文本文件,因为输入文件很小,您的程序甚至会在收到第一个警报信号之前终止。
此外,您的程序应该处理键盘中断产生的信号。当按下 Ctrl + C 时,您的程序应该询问用户是否要退出,而不是默认终止该过程。用户可以输入“y”或“n”字符。如果用户选择“y”,那么您的程序应该打印到目前为止的统计信息并退出。否则它应该继续运行。 当按下 Ctrl + Z 时,您的程序应该打印到目前为止的统计数据并继续计数。
确保提供带有适当缩进和文档的C文件。
单词的计数非常简单,但关键是我在信号中丢失了,请你帮助我
答案 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;
}