博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2.3 linux C 进程与多线程入门--(3)信号
阅读量:5123 次
发布时间:2019-06-13

本文共 2295 字,大约阅读时间需要 7 分钟。

概念:

    信号是系统响应某些状况而产生的事件,进程在接受到信号时会采取相应的行动。信号可以明确的由一个进程产生发送到另外一个进程,用这种办法传递信息或协调操作行为。

进程可以生成信号,捕捉并相应信号或屏蔽信号。信号的名称是在头文件signal.h里定义。下面我列出一部分。

---------------------------------------------------------------------------------

信号名称                            说明

---------------------------------------------------------------------------------

SIGALRM                         警告钟

SIGHUP                           系统挂断

SIGINT                             终端中断

SIGKILL                           停止进程(此信号不能被忽略或捕获)

SIGPIPE                          向没有读者的管道写数据

SIGQUIT                          终端退出

SIGTERM                        终止

---------------------------------------------------------------------------------

函数:

#include<signal.h>

void (* signal(int sig,void (*func) (int )))(int );

    这个函数看起来很复杂 , 但使用很简单。第一个参数sig 就是准备捕获或屏蔽的信号,接收到指定信号时将调用func函数处理。

实例1: 处理sigint信号

ctrlc.c 文件

  1. #include <signal.h>  

  2. #include <stdio.h>  

  3. #include <unistd.h>  

  4.   

  5. void ouch(int sig)  

  6. {<pre name="code" class="cpp">      /*此处,signal(SIGINT,  SIG_DFL),SIG_DFL表示 ouch函数捕获到SIGINT信号,作出输出信息处理之后,恢复了SIGINT的默认行为*/</pre>  printf("OUCH! - I got signal %d\n", sig);  

  7. <div><img src="file:///C:\users\banana\AppData\Tencent\Users\294299195\QQ\WinTemp\RichOle\}_J$7`I)~JBGVXP3]`BVX6U.jpg" alt=""></div>  

  8. (void) signal(SIGINT, SIG_DFL);}int main(){ (void) signal(SIGINT, ouch); while(1) { printf("Hello World!\n"); sleep(1); }}  

  9. <pre></pre>  

  10. 这个程序就是截获组合键Ctrl+C产生的SIGINT信号。没有信号出现时,它每隔一秒就会输出一个消息。第一次按下Ctrl+C产生的SIGINT信号,  

  11. <pre></pre>  

  12. <pre></pre>  

程序会调用ouch()函数,输出信息,同时,回复sigint为默认行为(即按下artc+c组合键即结束运行)

实例2:模仿闹钟行为

函数1:

#inlcude<sys/types.h>

#include<signal.h>

int kill (pid_t ,int sig);

kill 函数的作用是把sig信号发送给表示为pid的进程,成功时返回0.失败时返回-1,要想发送一个信号,两个进程(发送和接受)必须同样拥有用户id,就是说,你只能向自己的另一个进程发送信号,但是超级用户可以向任何进程发送信号。

函数2

#include <unistd.h>

unsigned int alarm (unsigned int seconds )  ;

alarm函数是在seconds秒后安排发送一个SIGALARM信号。若seconds为0,表示将取消全部已经设置的闹钟请求。每一个进程只有一个可用的闹钟。

它的返回值是前一个闹钟闹响之前还需经过的剩余秒数。调用失败则返回“-1”.

  1. #include <signal.h>  

  2. #include <stdio.h>  

  3. #include <unistd.h>  

  4.   

  5. static int alarm_fired = 0;  

  6.   

  7. void ding(int sig)  

  8. {  

  9.     alarm_fired = 1;  

  10. }  

  11.   

  12.   

  13. int main()  

  14. {  

  15.     int pid;  

  16.   

  17.     printf("闹钟程序已经启动\n");  

  18.     /*子进程休眠5秒后向父进程发送SIGALARM信号,然后结束进程*/  

  19.     if((pid = fork()) == 0) {  

  20.         sleep(5);  

  21.         kill(getppid(), SIGALRM);  

  22.         exit(0);  

  23.     }  

  24.   

  25.    /*父进程执行的内容*/  

  26.     printf("5秒后闹铃启动\n");  

  27.     (void) signal(SIGALRM, ding);  

  28.     /*将运行的程序挂起,直到接收到信号为止*/  

  29.     pause();  

  30.     if (alarm_fired)  

  31.         printf("Ding!\n");  

  32.   

  33.     printf("done\n");  

  34.     exit(0);  

  35. }  

  36. 程序通过fork启动一个新进程,这个紫禁城休眠5秒后向 自己的父进程发送一个SIGALARM信号。父进程在安排好捕捉SIGALARM信号后暂停运行,直到接收到一个信号为止。

    运行结果见下图:

 

转载于:https://www.cnblogs.com/yjds/p/8598870.html

你可能感兴趣的文章
mysql几种存储引擎介绍
查看>>
转-Android客户端和服务端如何使用Token和Session
查看>>
IOS第14天(2, Modal控制)
查看>>
删除确认代码
查看>>
刻意练习
查看>>
学习笔记13_第三方js控件&EasyUI使用
查看>>
Java变量的初始化问题探究
查看>>
DSU on tree——令人惊叹的想法
查看>>
javascript 闭包
查看>>
约瑟夫环问题
查看>>
c++ __int64
查看>>
IP封锁 (防火墙维护一张IP黑名单)
查看>>
【模板】trie树(字典树)
查看>>
JSON.stringify 语法实例讲解
查看>>
Python6 模块
查看>>
P3377 【模板】左偏树(可并堆)
查看>>
Djang 用户登录
查看>>
Java同步锁——lock与synchronized 的区别【转】
查看>>
洛谷-校门外的树-数组
查看>>
Python--网络编程-----文件传输简单版本
查看>>