上次我问过我的项目中的信号,你的帮助很有帮助。我只遇到一个问题。我想读取一个文件(必须是大文本文件)并计算一些单词的出现次数。这不再是问题了 但每当我调用SIGSTP(ctrl + Z)时,程序应该显示它现在正在读取的行号,这怎么可能。 我知道如何计算整个文本的行数,所以如果我在某个时间调用它,返回的数字将是整个行号或正在读取的行
答案 0 :(得分:1)
您可以使用信号系统调用注册特定信号:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
例如:
void signal_handler(int signal)
{
//display line number
}
signal(SIGSTP, signal_handler);
信号将中断当前代码链,这意味着在读取文件时可以调用信号处理程序。 如果使用全局变量来存储正在读取的行,则返回最新的调用值。
答案 1 :(得分:1)
维护一个全局整数计数器,它是正在读取的行的行号。每次读一行时增加(或者如果你没有按行阅读,每次点击\n
时)。在信号处理程序中打印。
请注意,尽管上述方法有效,但从技术上讲,使用man -s7 signal
或其他方式在信号处理程序中打印任何内容都是不安全的(请参阅printf
以查看可以执行的安全操作列表)缓冲I / O,所以从技术上讲,你应该使用write
或类似的,自己进行格式转换。