终端控制与信号浅析

来源:互联网 发布:linux定时脚本 编辑:程序博客网 时间:2024/05/13 06:21

终端控制

程序在终端显示时会与程序本身有一些出入,比如在运行下面这段代码时运行时直接按回车,则两次的输出结果都是10,即\n的ASCII码。在printf输出\n时,终端显示\r\n,在getchar读入的时候ENTER,又被处理成\n。又比如我们都知道程序的I/O有缓冲区,能够暂存程序输入输出的信息等特点。

#include "stdio.h"int main(int argc, char const *argv[]){     char ch;     ch = '\n';     printf("%d\n", ch);     ch = getchar();     printf("%d\n", ch);     return 0;}

这些东西都与本章的一个重点设备驱动器有关,当我们打开一个终端时,终端驱动器就调用了默认的设置,规范处理终端与程序之间的数据流,比如缓冲、编辑等功能。默认的顺序是:1、控制字符处理,2、回显,3、将”\r”转换成”\n”,4、输入编辑程序。规范处理也能够通过改变属性等变为非规范处理:如stty -icanon可关闭规范处理,stty -echo可关闭回显。通过调试设备驱动器的属性能够使程序的人机交互更人性化。

信号
运行一个进程时,ctrl_c能发出SIGINT信号中断程序,ctrl_d能发出SIGQUIT信号退出程序。然而实际上进程处理信号可以有三种属性可以条件:1、接收默认处理2、忽略信号3、调用一个函数(signal函数)。
result = singnal(int signum, void(*action)(int));
action可以是任意函数也可以是SIG_IGN(忽略信号)和SIG_DFL(将信号恢复为默认处理)两个特殊值。

异步信号与按键都属于键盘输入。默认状态下,常规的键盘输入将数据通过驱动程序传输到程序,而有些键则会调用驱动程序中的编辑函数,如按下退格键时,驱动程序将前一字符从行缓存中删除,并将命令发送到终端,使之从显示器中删除程序。而信号则是调用内核中的某个函数,给进程发送一个信号。

0 0