[Linux]信号

Linux下的信号是一个什么概念呢。我们在现实生活中也遇到过信号之类的。比如红绿信号灯,班主任叫你去办公室并且脸色不好,诸如此类的都会给你一个信号。让你辨别事情的发生。同样,Linux下也有许多的信号,让你执行相应的操作。比如我们经常使用的ctrl + c,ctrl + z,ctrl + d等,想结束掉当前的进程,我们通常使用ctrl + c,但是ctrl+c只适用于前台进程,如果是切换到后台进程的话,ctrl+c就终止不了。

我们写了一个死循环的输出“hello world”的例子,当我们使用ctrl+c的时候,相当于触发了2号信号来中断进程,当我们把它放到后台运行的时候,使用ctrl+c根本不管用。因为它信号只能对前台进程这样操作。

这里写图片描述

那么我们怎么终止它呢。这些信号里边有特殊的信号是可以终止后台进程的,9号信号(SIGKILL),这就是kill信号的强大之处。(如果所有的进程都放在后台,且都终止不了,那操作系统不得挂掉啊^_^哈哈)当然不只是9号信号可以对后台进程操作,还有些也可以。只是9号信号大家经常用到。所以就多说几句哈。(这里还要强调的一点是,shell不仅可以运行一个前台进程,还可以运行任意多个后台进程)

这里写图片描述

比如:

通过命令Kill -l,可以查看信号:

这里写图片描述

以上就是62个信号,其中1-31为普通信号,34-64为实时信号。

上面说了1-31号为普通信号,那么它可以用什么来表示呢。1和31这个敏感的数字,我们可以想到什么呢。是不是可以想到位图。32个比特位,每一位表示一个信号存在或者不存在。这样的话就只需要4个字节(也即一个整数)就可以存放这些信号了。

信号的处理动作主要有:

1.忽略该信号
2.执行该信号的默认处理动作
3.捕捉信号(自定义动作,自己定义的一些信号处理函数)
对于捕捉自定义信号,举个栗子哈:

这里写图片描述

当我们触发到2号信号时,我们就会执行自定义的信号处理函数,会打印出pid和sig值。而不再是终止进程。
结果如下:

这里写图片描述

小姿势(哈哈):

信号具有异步的特点,主要体现在任何一个时刻都可能产生信号。

那么话题又来了,产生信号的条件有哪些呢?

(1)像刚刚产生的信号,是用键盘产生的。键盘按ctrl+c,ctrl+z,ctrl+d等等。

(2)还有可能是因为某一个异常触发了某一个信号导致的。

这里写图片描述

比如上述这个题目,本来除数不能为0,这里让被除数除以一个为0的数,此时就会抛出异常。

这里写图片描述

这里的这个异常就是段错误所导致的。

(3)由于系统调用接口产生信号。系统调用接口,主要有以下几种:

1.自己写一个kill函数,来调用kill函数或者直接调用系统的kill函数使其产生9号信号。
系统的killint kill(pid_t pid,int sig);
2.调用raise函数,自己给自己发信号。
3.调用abort函数,像exit一样,触发捕捉信号后终止进程。

1.kill函数(成功返回0,错误返回-1)

这里写图片描述

运行结果为:运行完5个hello world之后,将执行2号信号,因此进程退出。

这里写图片描述

在这里,如何自己定义一个mykill函数呢。

这里写图片描述

它会检测你命令行上输入的命令,如果错误,将会给你显示出kill的正确用法。

这里写图片描述

上述用法错误,给你提示了。

比如先启动一个进程:(本身是死循环)

这里写图片描述

然后我们将其杀死:(通过获取进程号,这样就模拟了系统的kill函数)

这里写图片描述

2.使用raise函数(成功返回0,错误返回-1)

这里写图片描述

此时,结果与上述一样,只是raise为自己给自己发送2号信号。

这里写图片描述

3.使用abort函数(函数总会成功,所以没有返回值)

这里写图片描述

运行结果为:

这里写图片描述

(4)通过软件触发产生信号。主要使用alarm函数来触发SIGALRM信号。

unsigned int alarm(unsigned int seconds);
参数为秒数,多少秒之后触发SIGALRM信号。

这里写图片描述

这个例子当3秒之后触发alarm信号,终止进程

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据结构]Map和Set

说起map和set,想必我们都学过红黑树了吧,map和set就是红黑树的一个应用领域。它的底层就是由红黑树来实现的。下面简单说一下map和set的使用吧。 首先,有一个栗子是这样的,让我们统计出每种水果出现的次数。 我们会想到怎么解决…

linux之信号

信号:在生活中,我们遇到过不同种类的信号,比如:(交通信号,乃至某个人的表情,动作等带给你不同的信号)然而,在我们的linux下,我们最熟悉的就是,当遇…

[Linux]继续探究mysleep函数(竞态条件)

之前我们探究过mysleep的简单用法&#xff0c;我们实现的代码是这样的&#xff1a; #include<stdio.h> #include<signal.h>void myhandler(int sig) {}unsigned int mysleep(unsigned int timeout) {struct sigaction act,oact;act.sa_handler myhandler;sigempt…

[Linux]死锁

死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局&#xff0c;当进程处于这种僵持状态时&#xff0c;若无外力作用&#xff0c;它们都将无法再向前推进。之前信号量的时候我们知道&#xff0c;如果多个进程等待&#xff0c;主要体现在占有锁的问题上。死锁也可以被定义…

[Linux]线程安全和可重入函数

线程安全&#xff1a;一个函数被称为线程安全的&#xff0c;当且仅当被多个并发进程反复调用时&#xff0c;它会一直产生正确的结果。如果一个函数不是线程安全的&#xff0c;我们就说它是线程不安全的。 重入&#xff1a;函数被不同的控制流程调用,有可能在第一次调用还没返回…

[Linux]信号量

信号量是一个计数器&#xff0c;用于为多个进程提供对共享数据对象的访问。 在信号量上只有三种操作可以进行&#xff0c;初始化、递增和增加&#xff0c;这三种操作都是原子操作。递减操作可以用于阻塞一个进程&#xff0c;增加操作用于解除阻塞一个进程。 为了获得共享资源…

[Linux]关于SIGCHLD

之前我们就学过&#xff0c;关于wait和waitpid来处理僵尸进程&#xff0c;父进程等待子进程结束后自己才退出&#xff0c;这样的方法有俩种方式&#xff0c;一种是父进程死死的等子进程退出&#xff0c;也就是使用阻塞的方式等待子进程退出&#xff0c;另一种方式是通过非阻塞的…

C语言思维导图

本人能力有限&#xff0c;知识点难免概括不全&#xff0c;如有错误欢迎指正

pthread和互斥量条件变量函数意义速查表

数据类型 pthread_t 线程 互斥量和条件变量

[Linux]共享内存

共享内存是UNIX提供的进程间通信手段中速度最快的一种&#xff0c;也是最快的IPC形式。为什么是最快的呢&#xff0c;因为数据不需要在客户进程和服务器进程之间复制&#xff0c;所以是最快的一种IPC。这是虚存中由多个进程共享的一个公共内存块。 两个不同进程A、B共享内存的…

[Linux]gdb调试多进程多线程例程

gdb相信学linux的同学已经比较熟悉了吧&#xff0c;它是linux下代码调试工具。我们在写c语言&#xff0c;c的代码时经常会用到&#xff0c;它有一些常用的调试命令: run&#xff08;r&#xff09;&#xff1a;运行程序&#xff0c;如果有断点在下一个断点处停止 start&#xf…

[Linux]守护进程(精灵进程)

一、守护进程是什么 守护进程是生存期很长的一种进程&#xff0c;可以说它是7*24小时工作的。&#xff08;什么是7*24&#xff0c;一周7天&#xff0c;每天24小时&#xff0c;这不就是一年365天一直在工作嘛&#xff0c;还搞的这么诙谐&#xff0c;哈哈&#xff09;。它们常常…

浅谈shell中的clear命令实现

NAME(名称) clear - 清除终端屏幕 SYNOPSIS(总览) clear DESCRIPTION(描述) clear可以在允许的情况下清屏. 它会在环境变量中查找终端的类型, 然后到terminfo数据库中找出清屏的方法. 《man手册》 #include <stdio.h>int clear_main(int argc, char **argv) {/* Th…

[Linux]ARP协议

概念&#xff1a; 1. ARP协议(地址解析协议):由IP地址转换为MAC地址的协议。IP地址&#xff1a;网络号主机号。MAC地址&#xff1a;数据链路层的物理地址&#xff08;硬件地址&#xff09;。IP协议使用了ARP协议&#xff0c;因此被划归为网络层&#xff0c;但其用途是从网络层…

Makefile使用及多文件gdb 调试

文件内容 [koulocalhost makefile]$ cat 1.c #include "3.h" int main() {key_t key ftok(".",1);printf("%d\n",add(1,2));return 0; }[koulocalhost makefile]$ cat 2.c #include "3.h" int add(int a, int b) {return a b; } [k…

[Linux]CRC校验

CRC(Cyclic Redundancy Check),循环冗余校验码&#xff0c;是数据通信领域中最常用的一种差错校验码&#xff0c;其特征是信息字段和校验字段的长度可以任意选定。 CRC校验步骤&#xff1a; CRC分为两部分&#xff0c;前部分为信息码&#xff0c;后部分为校验码&#xff1b;设…

python字符串系列

1.find方法用于在长串中查找子串&#xff0c;返回子串中最左位置的下标&#xff0c;如果没找到&#xff0c;则返回-1 2.join方法用于在队列中添加元素 3.lower返回字符串的小写字母版 4.replace返回字符串中所有匹配项均被替换之后得到字符串 5.split将字符串分割成序列 6.stri…

linux网络编程Internet Socket地址,套接字,和函数

文章内容节选《linux/UNIX 系统网络编程》 Internet domain socket地址有两种&#xff1a;IPv4 IPv6 IPv4被存储在结构体中&#xff0c; 该结构体在 netinet/in.h 中进行定义 cd usr/include/netinet/in.h struct in_addr {in_addr_t s_addr; //32位IPv4地址 }struct so…

浅谈socket网络编程函数参数(一)

socket函数解析 概念: 每个进程的进程空间里都有一个socket描述符表。套接字描述符表属于一个进程&#xff0c;而socket地址结构位于操作系统的内核缓冲。 函数原型 #include <sys/socket.h>int socket(int domain, int type, int protocol);函数参数 family参数 默…

为什么计算机起始时间是1970年1月1日

1969年8月&#xff0c;贝尔实验室的程序员肯汤普逊利用妻儿离开一个月的机会&#xff0c;开始着手创造一个全新的革命性的操作系统&#xff0c;他使用B编译语言在老旧的PDP-7机器上开发出了Unix的一个版本。随后&#xff0c;汤普逊和同事丹尼斯里奇改进了B语言&#xff0c;开发…