linux 终端控制和信号
虽然设备看起来很像磁盘文件,但是设备文件不同于磁盘文件。
程序如何识别磁盘文件和设备文件
1.软件工具:从stdin 或文件读入,写道stdout
对磁盘文件和设备文件不加以区分的程序称为软件工具,如 who,ls sort 等。
2.特定设备程序,为特定应用控制设备
其他程序也能同特定设备交互,
3.用户程序:常见的设备相关程序
如 vi more pine 等 这些程序设置终端驱动的击键和输出储块方式。
stty -icanon: 关闭终端的规范模式处理。
终端模式:
1.规范模式:cooked模式,常见的用户模式,输入存在缓冲中,可以对缓存数据进行编辑,接收到回车才发送到程序。
2.非规范模式:缓冲和编辑功能关闭。
3.raw模式:每个处理步骤都被独立的位控制。
信号: 信号是由单个词组成的消息。
信号来源:
1.用户,或是终端驱动程序分配给信号控制字符的其他任何键来请求内核产生信号。
2.内核,进程执行出错时,内核内进程发送一个信号,内核也利用信号通知进程特定事件的产生
3.进程,一个进程可以通过系统调用kill 给另一个进程发送信号。进程间可以通过信号进行通信。
同步信号:进程的某个操作产生的信号
异步信号:用户击键等进程外的事件引起的信号
man 7 signal 查看信号相关帮助。
信号SIGINT 杀死一个进程,但是进程也有办法保护自己不被杀死。
进程接受到 SIGINT 信号时,进程能够通过系统调用 signal 告诉内核,他要如何储块信号,有三个选择
1.接受默认处理(死亡)signal(SIGINT,SIG_DFL);
2.忽略信号 signal(SIGINT,SIG_IGN);
3.调用一个函数 signal(signum, functionname);
#include
typedef void (*sighandler_t)(int);
sighandler_t ret=signal(int signum, sighandler_t handler);
signum=需要响应的信号
handler=信号相应函数
ret:-1=失败,0=成功
handler:可以是函数名或者特殊字符:
SIG_IGN:忽略信号
SIG_DFL:将信号恢复为默认处理