zoukankan      html  css  js  c++  java
  • CSAPP笔记(第八章 异常控制流)-02

    第八章的内容为p537~p586, 分2部分, p537~p562, p563~p586. 本文为第2部分.

    摘要

    这章看的很乱, 先记录下.

    信号

    软件形式的异常, 称为Linux信号, 允许进程和内核中断其他进程.

    如果一个进程除0, 内核就给它发送一个SIGFPE信号; 如果一个进程执行一条非法指令, 内核就给它发送一个SIGILL信号.

    信号术语

    传送一个信号由2个部分组成, 发送信号和接收信号.
    发送信号: 内核通过更新进程上下文中的某个状态, 发送一个信号给进程.
    接收信号: 当目的进程被内核强迫以某种方式对信号的发送做出反应时, 它就接收了信号. 进程可以忽略这个信号, 或者执行信号处理程序捕获这个信号.

    任何时刻, 一种类型至多只会有一个待处理信号. 一个待处理信号最多只能被接收一次. 内核为每个进程在pengding位向量中维护着待处理信号的集合, 只要传送了一个类型为k的信号, 内核就会设置pengding中的第k位, 而只要接收了一个类型为k的信号, 内核就会清除第k位.

    发送信号

    #include <unistd.h>
    pid_t getpgrp(void); //返回调用进程的进程组ID
    
    int setpgid(pid_t pid, pid_t pgid);//设置进程组ID, 成功返回0, 否则返回-1
    
    /bin/kill -9 15213 //给进程15213发送信号9(SIGKILL)
    

    Ctrl+C会导致内核发送一个SIGINT(终止)信号到前台进程组的每个进程组.
    Ctrl+Z会发送一i个SIGTSTP(挂起)信号到前台进程组的每个进程.

    #include <sys/types.h>
    #include <signal.h>
    
    int kill(pid_t pid, int sig);//进程通过调用kill函数发送信号给其它进程(包括自己). 成功返回0, 失败返回-1
    
    #include <unistd.h>
    unsigned int alarm(unsigned int secs);//定时处理程序
    

    参考linux定时器之alarm

    接收信号

    当内核把进程p从内核模式切换到用户模式时, 它会检查进程p的未被阻塞的待处理信号的集合(pending & ~blocked), 如果这个集合为空, 则执行下一条指令(I_{next}). 如果集合非空, 内核选择集合中的某个信号k(通常最小的k), 强制p接收信号k, 完成k后再继续执行指令(I_{next}).

    每个信号类型都有一个预定义的默认行为, 进程终止, 进程终止并转储内存, 进程停止(挂起)直到被SIGCONT信号重启, 进程忽略该信号.

    #include <signal.h>
    typedef void (*sighandler_t)(int);
    
    sighandler_t signal(int signum, ,sighandler_t handler);//设置信号处理函数handler
    

    后面的先跳过了...

  • 相关阅读:
    KMP+Tire树(模板)
    序列自动机(模板)
    欧拉函数(转载)
    Django之ContentType组件
    RestFramework之注册器、响应器与分页器
    RestFramework之频率组件
    RestFramework之权限组件
    RestFramework之认证组件
    RestFramework之视图组件
    RestFramework之序列化组件
  • 原文地址:https://www.cnblogs.com/winwink/p/CSAPP_Note_Chapter8_Exception_02.html
Copyright © 2011-2022 走看看