《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信号,导致信号处理函数被连续调用好几次,但其实我们只需要窗口最终调整完后,调用信号处理函数。
项目
结束
这章主要讲了终端控制,终端具有丰富的配置――模式,非堵塞,回显,超时等。期待下一章的视频游戏。