30.1 信号的基本概念

  • 信号(signal)机制是Linux 系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化
  • 信号是软件中断
  • 信号是异步事件
    •   不可预见
    • 信号有自己的名称和编号
    • 信号和异常处理机制
  • 信号发生的来源
    • 硬件来源:如按下键盘或其他硬件故障,信号是由驱动程序产生
    • 软件来源:最常用发送信号的系统函数是 kill(),raise(),alarm() 和 setitimer() 等函数,软件来源还包括一些非法运算等操作,软件设置条件(如:gdb调试),信号是由内核产生。

  查看系统当中的信号:kill -l

  

  • [1 ~ 31] 信号称为非实时信号

    • 发送的信号可能丢失,不支持信号排队
  • [32 ~ 64] 信号称为实时信号
    • 发送的多个实时信号都会被接受,支持信号排队
  • 信号无优先  信号定义的地方:/usr/include/bits/signum.h 和 signum-generic.h

30.2 信号的处理和变革

30.2.1 信号的处理

  • 忽略信号

    • SIGKILL 和 SIGSTOP 永远不能忽略
    • 忽略硬件异常
    • 进程启动时 SIGUSR1 和 SIGUSR2 两个信号被忽略
  • 执行默认操作
    • 每个信号有默认动作,大部分信号默认动作是终止进程
  • 捕获信号
    • 告诉内核出现信号时调用自己的处理函数
    • SIGKILL 和 SIGSTOP 不能被捕获

30.2.2 信号变革

  • 信号出现在早期的 UNIX 中
  • 早期信号模型是不可靠的
  • BSD 和 SYSTEM V 分别对早期信号进行扩展,但是相互不兼容
  • POSIX 统一了上述两种模型,提供了可靠信号模型  

30.3 signal 函数

 #include <signal.h>
void (*signal(int signo, void (*func)(int )))(int );
  • 函数功能:向内核登记信号处理函数
  • 函数参数:
    • signo:要登记的信号值
    • func:
      • 信号处理函数指针
      • SIG_IGN:忽略信号
      • SIG_DFL:采用系统默认的方式处理信号,执行默认操作
  • 返回值:若成功,则返回先前的信号处理函数指针,出错,则返回 SIG_ERR 

  signal 函数原型如下:

  

  

 #include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h> /** 定义信号处理函数
* signo 进程捕获到的信号
*/
void sig_handler(int signo)
{
printf("%d, %d occured\n", getpid(), signo);
} int main(void)
{
/** 向内核登记信号处理函数以及信号值 */
if(signal(SIGTSTP, sig_handler) == SIG_ERR) {
perror("signal sigtstp error");
} if(signal(SIGINT, sig_handler) == SIG_ERR) {
perror("signal sigint error");
} if(signal(SIGUSR1, sig_handler) == SIG_ERR) {
perror("signal usr1 error");
} if(signal(SIGUSR2, sig_handler) == SIG_ERR) {
perror("signal usr2 error");
} if(signal(SIGKILL, SIG_IGN) == SIG_ERR) {
perror("signal sigtstp error");
} if(signal(SIGSTOP, SIG_IGN) == SIG_ERR) {
perror("signal sigint error");
}
int i = ;
while(i < ) {
printf("%d out %d\n", getpid(), i++);
sleep();
} return ;
}

 

三十、Linux 进程与信号——信号的概念及 signal 函数的更多相关文章

  1. linux进程通信之信号

    本节主要学习信号和与信号相关的处理函数,兴许还会更新. http://blog.csdn.net/xiaoliangsky/article/details/40264151 一 信号 信号是UNIX和 ...

  2. linux 进程通信之 信号

    一,管道PIPE 二,FIFO通信 三,mmap通信 四,信号的概念 信号的特点:简单,但不能携带大量的信息,满足特定条件就会发生 信号的机制:进程B发送信号给进程A.信号是由内核来处理的. 信号的产 ...

  3. Linux 进程通信之 ——信号和信号量总结

    如今最经常使用的进程间通信的方式有:信号,信号量,消息队列,共享内存.       所谓进程通信,就是不同进程之间进行一些"接触",这种接触有简单,也有复杂.机制不同,复杂度也不一 ...

  4. Linux 信号详解一(signal函数)

    信号列表 SIGABRT 进程停止运行 SIGALRM 警告钟 SIGFPE 算述运算例外 SIGHUP 系统挂断 SIGILL 非法指令 SIGINT 终端中断 SIGKILL 停止进程(此信号不能 ...

  5. Linux进程理解与实践(四)wait函数处理僵尸进程

    Wait的背景 当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程 ...

  6. linux进程管理之信号控制

    使用信号控制进程 ====================================================================================kill,ki ...

  7. linux 进程学习笔记-信号semaphore

    信号灯(信号量)不是进程通信手段,其是用于控制和协调在进程间通信过程中的共享资源访问,就如同互斥锁(两者的区别可以参考这里) 可以将简单地将信号灯想象成一个计数器,初始时计数器值为n(有n个资源可供使 ...

  8. 第三十天- 进程 Process模块 空间隔离

    1.进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体: ...

  9. 实验三:Linux进程管理(HDU)

    2.设计内容 把下面的几个网址的内容看懂,关于Linux的通信机制就会有个基本的了解了,后面的这几个代码也应该可以看得懂了. 管道通信:https://blog.csdn.net/ljianhui/a ...

随机推荐

  1. Baker Vai LightOJ - 1071 (MCMF)

    在个给出的矩阵从,从左上角走到右下角,然后再从右下角走到左上角,两次不能经过想同的点,每个点都有一个价值,问最大的价值是多少. 可以把原来的问题化简成从左上角走两条路到右下角,然后把价值加起来,然是这 ...

  2. [HEOI2015]小Z的房间(矩阵树定理学习笔记)

    题目描述 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. 你想要打通一 ...

  3. nc 使用实例

    nc.exe -h即可看到各参数的使用方法.基本格式:nc [-options] hostname port[s] [ports] ...nc -l -p port [options] [hostna ...

  4. 【洛谷P2868】Sightseeing Cows

    题目大意:给定一个 N 个点,M 条边的有向图,点有点权,边有边权,求该有向图中的一个环,使得环上点权和与环上边权和之比最大. 题解:0/1 分数规划思想,每次二分一个 mid,在新图上跑 spfa, ...

  5. python 当前时间获取方法

    1.先导入库:import datetime 2.获取当前日期和时间:now_time = datetime.datetime.now() 3.格式化成我们想要的日期:strftime() 比如:“2 ...

  6. Django(二)框架第一篇基础

    https://www.cnblogs.com/haiyan123/p/7701412.html 一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref ...

  7. 第三十二篇-NavigationView导航抽屉的使用

    效果图: 导航抽屉所用到的布局是DrawerLayout,可以在里面添加一个线性布局和TextView组件,TextView组件的文本信息就是"主页面".然后和线性布局平行添加一个 ...

  8. hdu 3415"Max Sum of Max-K-sub-sequence"(单调队列)

    传送门 题意: 给出一个有 N 个数字([-1000 , 1000],N ≤ 105)的环状序列: 让你求一个和最大的连续子序列,并记录起始点. 要求这个连续子序列的长度小于等于K,加和相同的不同区间 ...

  9. Kubernetes的负载均衡问题(Nginx Ingress)

    nginx 反向代理 https://www.cnblogs.com/ericnie/p/6965091.html Kubernetes 集群中使用 Traefik https://blog.csdn ...

  10. hibernate的学习周

    Hibernate核心:ORM(对象关系映射) BeginSession关闭的时候要session.close(),而getCurrentsession不需要,它会自动关闭 Session.load( ...