HOME

《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信号,导致信号处理函数被连续调用好几次,但其实我们只需要窗口最终调整完后,调用信号处理函数。

项目

结束

这章主要讲了终端控制,终端具有丰富的配置――模式,非堵塞,回显,超时等。期待下一章的视频游戏。

Created: 2018-02-06 Tue 15:29

Emacs 24.5.1 (Org mode 8.2.10)