信号上篇
来源:互联网 发布:淘宝 市场份额 编辑:程序博客网 时间:2024/06/04 18:00
linux下的信号就是我们看到信息的一种,比如在现实生活中我们在过马路的时候我们看到红灯(红灯就是信号),会停下来(信号的识别,看到信号并直到怎么做);回到linux操作系统下,我们写的代码中有无限循环语句时,进程一直在执行不会结束,在键盘上按ctrl+c键,操作系统给进程发送一个2号信号来结束进程。操作系统给进程发信号,其实就是设置该进程PCB中的信号字段(当一个进程收到一个信号时,不会立即去处理,而是等到合适的时候处理)。
用kill -l 命令查看系统的信号列表,如下图(1-31普通信号,34-62实时信号):
上述中的ctrl+c产生的信号只能发送给前台进程,shell可以同时运行一个前台进程和任意多个后台进程,一个命令后面加个&就可以放到后台运行;
#include<stdio.h>int main(){while(1);return 0;}
在mysignal进程运行时查看进程信息,R+表示该进程是前台进程;
当我们在执行./mysignal时在其后面加上&就可以变为后台进程:
变为后台进程后,在后台执行mysignal进程时,ls命令也可以执行,由R+变为了R;
信号的处理:
1.忽略此信号
2.执行该信号的默认动作
3.提供一个信号处理函数,自定义其动作(信号的捕捉)
前两个都很简单,主要看看第三个捕捉信号:
#include<stdio.h>#include<signal.h>#include<stdlib.h>void myhandler(int sig){printf("pid:%d,sig:%d\n",getpid(),sig);}int main(){int i = 0;for(i = 1; i < 32; i++){signal(i,myhandler);}while(1);return 0;}
信号的产生:
1.通过终端按键产生信号
ctrl+z,ctrl+c等等...
2.调用系统函数产生信号
kill函数,向pid进程发送sig信号;
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
#include<stdio.h>#include<signal.h>#include<stdlib.h>int main(int argc, char *argv[]){kill(atoi(argv[1]),atoi(argv[2]));printf("pid:%d,sig%d,kill successed\n",atoi(argv[1]),atoi(argv[2]));return 0;}先运行一个进程mysignal,调用kill函数给该进程发信号结束这个进程;
raise函数:自己给自己发信号
#include <signal.h>
int raise(int sig);
在6秒后自己给自己发送9号信号,结束自己;
#include<stdio.h>#include<signal.h>#include<stdlib.h>int main(){int i = 0;while(1){printf("waitting..%d\n",6-i);sleep(1);if(i++ > 5)raise(9);}return 0;}
abort:函数使当前进程接收到信号而异常终止;
3.由软件条件产生信号
alarm(unsigned int seconds)
这个函数可以设定一个闹钟,告诉内核在seconds秒之后给当前进程发送SIGALRM信号。该信号的默认处理动作是终止当前进程;
- 信号上篇
- 信号
- 信号
- 信号
- 信号
- 信号
- 信号
- 信号
- 信号
- 信号
- <>信号
- 信号
- 信号
- 信号
- 信号
- 信号
- 信号
- 信号
- 欢迎使用CSDN-markdown编辑器
- PAT A+B和C
- Spring4 IOC 注解学习笔记
- 解密:Linux与Android的关系
- oracle监听程序当前无法识别
- 信号上篇
- 从AILD与bindService谈Binder进程间通信原理(上)
- input限制3位小数输入
- 第3章 装配Bean---高级装配--笔记3
- 运行pip报错:Fatal error in launcher: Unable to create process using '"'
- Spring缓存注解@Cache使用
- 结合sklearn进行特征工程
- 网易云音乐搜索引擎 python+whoosh---(1)背景和环境介绍
- SpringMVC使用@ResponseBody注解返回中文字符串乱码的问题