《Unix/Linux编程实践教程》笔记(5)——终端控制和信号
Table of Contents
内容
终端有好几种模式――规范模式,非规范模式,raw模式。play_again1关闭规范模式,使得不按回车就可以得到输入,设置了termios结构中c_cc[VMIN]位为1,这样 就可以每次只读取一个字符。
键盘输入有三类,1.常规数据 2. 编辑 3. 处理控制。比如Ctrl-C 就是通过驱动函数调用内核的某个函数,这个函数给进程发送一个信号。
信号是软件中断。signal函数可以告诉内核如何处理信号。有三种选择 1. 接收默认处理(通常是消亡) 2. 忽略信号 3. 调用一个函数。
| signal(int signum, void (* action) (int)) | 简单的信号处理 |
习题
6.6 实现行编辑功能
getchar 从终端输入流中得到内容,我将终端置于raw模式,然而backspace还是无法进入输入流。网上搜到可以用getch直接从键盘得到内容,我没去试。这个问题先留着。
6.10 中断调用状态报告
写一个耗时的不断寻找素数的程序,给信号SIGINT一个处理函数――报告当前找到的最大的素数。程序运行时,kill -2 pid,程序就会打应当前找到的最大的素数。代码如下
#include <stdio.h>
#include <math.h>
#include <signal.h>
void printmaxprime(int signum);
static long int maxprime;
void main()
{
long int x=100,i,a,d=2000000000;
signal(SIGINT, printmaxprime);
for(x;x<=d;x++)
{
a=sqrt(x);
for(i=2;i<=a;i++)
if(x%i==0) break;
if(i>=a)
{
maxprime = x;
//printf("maxprime is %d\n", maxprime);
}
}
}
void printmaxprime(int signum)
{
printf("maxprime is %d\n", maxprime);
}
6.12 终端窗口大小变化的信号
终端窗口大小变化时,会给终端里的程序发送SIGWINCH信号,程序默认都是屏蔽此信号的。以为是很简单的,运行时发现,将终端窗口大小从a变到d的过程中,a-b,b-c,c-d的过程中各会发送一次SIGWINCH信号,导致信号处理函数被连续调用好几次,但其实我们只需要窗口最终调整完后,调用信号处理函数。
项目
结束
这章主要讲了终端控制,终端具有丰富的配置――模式,非堵塞,回显,超时等。期待下一章的视频游戏。