《unix环境高级编程》-10.信号-读书笔记

一、基本概念

1、信号是软件中断。信号提供了一种异步处理事件的方法。

2、每个信号都有一个名字:这些名字都以SIG开头。

例如: SIGABRT是夭折信号,调用abort函数;SIGALRM是闹钟信号,当由alarm函数设置的计时器超时后产生此信号;

3、Linux支持31种不同的信号;但是同时支持由应用程序额外定义的信号,将其作为实时扩展。

4、头文件为: <signal.h>

5、不存在编号为0的信号,kill函数使用编号为0的信号作为试探进程时候存在的作用。

7、SIGINT:  Ctrl+C键通常产生中断信号(SIGINT),这是停止一个已失去控制的程序的方法。

8、SIGSEGV:   硬件异常产生信号:除数为0、无效的内存引用等,这些由硬件检测到,产生SIGSEGV信号

9、SIGURG:    网络连接传来带外数据时

10、SIGPIPE:    管道读进程终止后,进程写此管道时产生,SOCK_STREAM类型的socket关闭时也会产生

11、有两类不能忽略和捕捉的信号:

SIGKILL:

SIGSTOP:

不能忽略的原因是: 它们向超级用户提供了使进程终止或停止的可靠方法

12、捕捉信号: 要通知内核在某种信号发生时调用一个用户函数,在用户函数中,可执行用户希望对这种事件进行处理。

例如:

如果捕捉到一个SIGCHLD信号,则表示一个子进程已经终止,所以此信号的捕捉函数可以调用waitpid以取得该子进程的进程ID以及它的的终止状态。

二、信号 种类:

1、重要摘抄:

SIGINT:   当用户按中断键(一般采用DELETE或Ctrl+C)时,终端驱动程序产生此信号并送至前台进程组的每一个进程。当一个进程在运行时失控,特别是产生大量输出时,常用此信号终止它。

SIGTERM:   由kill命令发送的系统默认终止信号

SIGQUIT: 当用户在终端上按退出键(一般采用Ctrl+\)时,产生此信号,并送至前台进程组中的所有进程。此信号不仅会终止前台进程组,同时还会产生一个core文件。

SIGKILL:    这是两个不能忽略和捕捉的信号之一

SIGSTOP:    这是两个不能忽略和捕捉的信号之一:这是一个作业控制信号,用于停止一个进程。

SIGCHLD:    当一个进程终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认,将忽略此信号。如果父进程希望被告知其子进程的这种状态改变,则应该捕捉此信号。信号捕捉函数中通常要调用一种waitpid函数以取得子进程ID和其终止状态。

SIGHUP:    如果终端接口检测到一个链接断开,则将此信号发送给该终端相关的控制进程(会话首进程)。

2、所有信号:

1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL

5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE

9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2

13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT

17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP

21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU

25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH

29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN

35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4

39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8

43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12

47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14

51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10

55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6

59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2

63) SIGRTMAX-1  64) SIGRTMAX

三、signal函数:信号处理程序、信号捕捉函数

#include  <signal.h>

void  (*signal(int signo, void (*func)(int) ) )(int)

若出错返回SIG_ERR

注:因为signal的语义与实现有关,所以最好使用sigaction函数代替signal函数。

signo:

func的值:(1) 常量SIG_IGN、常量SIG_DEL (2)当捕捉到此信号时要调用的函数的地址。

如果指定SIG_IGN: 表示向内核忽略此信号

如果指定SIG_DEL: 表示捕捉到此信号时采取系统默认动作

四、测试signal函数

程序可运行:

#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>

pthread_mutex_t g_mut;
pthread_cond_t g_cond;
std::string msg;

void sig_capture( int signo ){
  pthread_mutex_lock ( &g_mut );
  switch( signo ){
  case SIGTERM:
    printf("DEBUG: now received SIGTERM(\n");
    msg = "SIGTERM";
    break;
  case SIGQUIT:
    printf("DEBUG: now received SIGQUIT\n");
    msg = "SIGQUIT";
    break;
  case SIGINT:
    msg = "SIGINT";
    printf("DEBUG: now received SIGINT\n");
    break;
  default:
    printf("DBEUG: can't identy this signal\n");
}
  pthread_mutex_unlock ( &g_mut );
  pthread_cond_signal( &g_cond );
}

int main ( int argc, char *argv[] ){

  pthread_mutex_init ( &g_mut, NULL );
  pthread_cond_init ( &g_cond, NULL );

  if ( signal( SIGTERM, sig_capture ) == SIG_ERR ){
    printf("DEBUG: can't catch signal( SIGTERM )\n");
    exit(100);
  }
  if ( signal( SIGQUIT, sig_capture ) == SIG_ERR ){
    printf("DEBUG: can't catch signal( SIGQUIT )\n");
    exit(200);
  }
  if ( signal( SIGINT, sig_capture ) == SIG_ERR ){
    printf("DEBUG: can't catch signal( SIGINT )\n");
    exit(300);
  }

  pthread_mutex_lock ( &g_mut );
  while( msg.empty() ){
    printf("DEBUG: now wait signal...\n");
    pthread_cond_wait ( &g_cond, &g_mut );
  }
  pthread_mutex_unlock( &g_mut );

  printf("DEBUG: now string: %s\n", msg.c_str());

  return 0;
}
时间: 2024-11-04 20:38:35

《unix环境高级编程》-10.信号-读书笔记的相关文章

UNIX环境高级编程之-----信号signal

参考书籍:unxi环境高级编程 信号函数: <span style="font-family:Microsoft YaHei;font-size:18px;">typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); </span> 其原型为: <span style="font-family:Microsoft YaHei;

Unix环境高级编程(十)信号续

1.signal函数 Unix系统的信号机制最简单的接口是signal函数,函数原型如下: #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); signum表示信号名称,handler取值常量SIG_IGN(忽略此信号).常量SIG_DFL(执行默认动作)或者接到此信号后要调用的函数的地址(调用信号处理程序). 写个程序练习一下

UNIX环境高级编程的脑图笔记

本脑图通过Coggle创造,请通过公开地址查看.

《Unix环境高级编程》读书笔记 第3章-文件I/O

1. 引言 Unix系统的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close 本章描述的函数经常被称为不带缓冲的I/O.术语不带缓冲指的是在用户的进程中对其不会自动缓冲,每个read和write都调用内核中的一个系统调用.但是,所有磁盘I/O都要经过内核的块缓存区(也称为内核的缓冲区高速缓存).唯一例外的是对原始磁盘设备的I/O. 2. 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数,其变化范围是0~OPEN_MAX

《Unix环境高级编程》读书笔记 第7章-进程环境

1. main函数 int main( int argc, char *argv[] ); argc是命令行参数的数目,包括程序名在内 argv是指向参数的各个指针所构成的数组,即指针数组 当内核执行C程序时(使用exec函数),在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址——这是由连接器设置的,而连接器则是由C编译器调用.启动例程从内核取得命令行参数和环境变量值,然后按上述方式调用main函数做好安排. 2. 进程终止 有8种方式使进程终止,其中5种

《UNIX环境高级编程》读书笔记 —— 文件 I/O

一.打开或创建一个文件 #include <fcntl.h> int open(const char *pathname, int oflag, .../*mode_t mode*/); 返回值:若成功则返回文件描述符,若出错则返回-1 oflag选项: O_RDONLY O_WRONLY O_RDWR 以上三个常量中必须指定一个,且只能指定一个. 以下常量都是可选的: O_APPED     每次写时追加到文件尾 O_CREAT     若文件不存在,则创建 O_EXCL      若同时指

UNIX环境高级编程学习笔记(第一章UNIX基础知识)

总所周知,UNIX环境高级编程是一本很经典的书,之前我粗略的看了一遍,感觉理解得不够深入. 听说写博客可以提高自己的水平,因此趁着这个机会我想把它重新看一遍,并把每一章的笔记写在博客里面. 我学习的时候使用的平台是Windows+VMware+debian,使用secureCRT来连接(可以实现多个终端连接). 因为第一章是本书大概的描述,所以第一章的我打算写得详细一点,而且书本的原话占的比例会比较多,重点的东西会用粗体显示出来. 1.1  引言 所有操作系统都为他们所运行的程序提供服务.典型的

4.28 UNIX环境高级编程 笔记

int dup(int filedes); int dup2(int filedes,int filedes2); 这两个函数都可以实现复制一个现存的文件描述符,但是dup一定返回当前可用最小文件描述符,dup2可以用filedes2参数指定新描述符数值.如果filedes2已经打开,则先将其关闭.如果filedes等于filedes2,则返回filedes2而不关闭. 这些函数返回的新文件描述符与参数参数filesdes共享同一个文件表项. 图3 执行dup之后的内核数据结构 dup2是原子操

UNIX环境高级编程笔记之文件I/O

一.看图说话 一图胜过千言,看图! 二.唠一唠 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书,也看过一些,但好像没有留下什么印象,今天再看,依然觉得像新的一样.很大的原因我想是一直以来都在用windows(用windows做开发为什么学不到真正的技术,我想大家都懂的),当然知识结构不完整,学习能力这些就不说了.所以,对于那些致力于想在Linux下做开发的人来说,

Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APU