3

《Unix/Linux编程实践教程》笔记(5)——终端控制和信号

 3 years ago
source link: https://houye.xyz/2018-01/uup5/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
《Unix/Linux编程实践教程》笔记(5)——终端控制和信号

《Unix/Linux编程实践教程》笔记(5)——终端控制和信号

终端有好几种模式――规范模式,非规范模式,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)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK