《Unix/Linux编程实践教程》chapter6 为用户编程:终端控制和信号

chapter6 为用户编程:终端控制和信号

章节知识总结

软件工具从标准输入读取字节,进行一些处理,然后将包含结果的字节流写到标准输出。工具发送错误消息到标准错误输出,它们也被当做简单的字节流来处理。

在这里插入图片描述

终端驱动程序完成缓冲、回显、编辑和控制键处理等操作。缓冲和编辑包含在规范处理,当这些特征被启动,终端连接被称为处于规范模式。

  • 规范模式,也被称为cooked模式,是用户常见的模式。驱动程序输入的字符保存在缓冲区,并且仅在接受到回车键时才将这些缓冲的字符发送到程序。缓冲数据使驱动程序可以实现最基本的编辑功能,如删除字符、单词或整行。可以通过命令stty或系统调用tcsetter来修改
  • 缓冲编辑功能被关闭时,连接被称为处于非规范模式。如果用非规范模式编写程序,并且希望用户能够编辑它们的输入,需要在你的程序中实现编辑功能。

可以通过指令stty -canon关闭终端驱动程序中的规范模式处理。

在这里插入图片描述

Unix中的软件中断被称为信号(signal),信号由内核产生,生成信号的请求来自3个地方:

  1. 用户:用户能够通过输入Crtl-CCtrl-\等生成信号
  2. 内核:当进程执行出错时,内核给进程发送一个信号;内核也利用信号通知进程特定事件的发生
  3. 进程:一个进程可以通过系统调用kill给另一个进程发送信号。一个进程可以和另一个进程通过信号通信

常见的信号有:

  • Crtl+c产生SIGINT中断信号
  • Crtl+\产生SIGQUIT退出信号
  • 计时器产生SIGALRM信号

当进程接受到信号时,有3个选择:

  1. 接受默认处理(通常是消亡)
  2. 忽略信号
  3. 调用一个函数:在信号到来时被调用的函数被称为信号处理函数

信号处理的简单例子:

#include<stdio.h>
#include<signal.h>

void main(){
    void f(int);
    int i;
    signal(SIGINT,f);
    for(i=0;i<5;++i)
    {
        printf("hello\n");
        sleep(1);
    }
}
void f(int signum)
{
    printf("OUCH!\n");
}

对于系统管理员(和程序员)来说,Unix有两个信号是不能被忽略和捕捉的,这两个信号是SIGSTOP(Crtl+Z)SIGKILL

系统调用
signal
signal
用途简单的信号处理
头文件#include<signal.h>
函数原型result=signal(int signum,void(*action)(int))
参数signum: 需响应的信号; action: 信号处理函数
返回值-1: 遇到错误; prevaction: 前一个处理函数,值是指向函数的指针
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值