10.信号;可靠信号/不可靠信号;可中断睡眠sleep/pause

1.信号简介

1.信号由[内核]产生发送的
2.信号的状态
	产生
	未决:未处理,等待被进程处理
	递达:已经处理
3.信号处理方式
	忽略
	捕捉
	执行了默认的操作
		Term  终止
		Ign   忽略
		Core  终止后,产生core文件,用于调试
		Stop  暂停
		Cont  继续执行
4.查看信号的默认动作以及信号的含义:man 7 signal
SIGABRT  进程非正常终止, 可能来自 abort(3)
SIGALRM  警告钟
SIGUP	 系统挂掉
SIGINT	 终端ctrl+C
SIGQUIT	 终端退出ctrl+\
SIGTERM	 终止
SIGKILL	 杀死进程信号
SIGPIPE	 向没有读者的管道写入数据
SIGSEGV	 段错误:无效内存段访问
SIGUSR1	 用户自定义信号1
SIGUSR2	 用户自定义信号2
SIGCHLD	 子进程停止

2.信号的分类:可靠信号(实时信号)和不可靠信号(不实时信号)

1.常识结论
  [1]实时信号都是可靠信号(支持排队);不实时信号都是不可靠信号(不支持排队)
  [2]kill -l的前31个信号,都是不可靠信号;后面的都是可靠信号
2.定义:
不可靠信号:指向应用程序发送了3次信号,而应用程序只接收到1次信号
可靠信号:指向应用程序发送了3次信号,有下面两种情况保证信号可靠:
	(1)应用程序收到3次信号
	(2)即使没收到3次信号:假设收到1次信号,则会告诉应用程序还有2此信号没收到
3.不可靠信号存在的缺点:信号可能丢失	

3.可中断睡眠

可中断睡眠的执行情况:
	进程开始时处于可中断睡眠状态;那么如果进程接收到信号后,进程将被唤醒而不在阻
塞,当执行完信号处理函数后,进程继续向下执行。

4.sleep

unsigned int sleep(unsigned int seconds);
	可中断睡眠:sleep在睡眠时,可能会被其他信号唤醒
	sleep函数的返回值:如果被信号唤醒,返回剩余秒数
代码案例:
  void handler(int arg){                                                                                                         
    printf("___________handler func\n");                                                                                         
  }                                                                                                                                                                                                                                             
  int main(){                                                                                                                    
    signal(SIGINT,handler);                                                                                                      
    //方式1:sleep(100); 
    /*
	  [1]按ctrl+C键,将调用SIGINT信号处理函数;
	  [2]sleep(100)将会被唤醒,程序不会继续睡下去,而是直接退出
	结论:sleep函数是可中断睡眠,将会被信号唤醒
	那么,怎样才能使得sleep睡够100s后,程序才退出呢?
    */	  
	//方式2:使用sleep的返回值,使得sleep函数睡够100s
	/*
	  [1]按ctrl+C键,将调用SIGINT信号处理函数	
	  [2]sleep(100)将会被唤醒,返回值n为剩下的秒
	     数,由于处于while循环中,因此还会继续睡下去,直到睡够100s
	*/
    int n=10;                                                                                                                    
    do{                                                                                                                          
      printf("begin sleep\n");                                                                                                   
      n=sleep(n);                                                                                                                
      printf("begin awake\n");                                                                                                   
    }while(n>0);                                                                                                                             
  }    

5.pause

int pause(void);  //将进程设为可中断睡眠状态
	pause使得调用者被挂起,直到被一个信号唤醒

猜你喜欢

转载自blog.csdn.net/weixin_36750623/article/details/83059884
今日推荐