nginx源码学习,linux信号详解

一、信号的基本概念

进程之间常用的通信手段
信号,通知某个进程发生某一件事情
都是突发事件,是异步发生的,所以也被称为“软件中断“

二、信号如何产生?

  • 1、某个进程发送给自己或者另一个进程
  • 2、由内核发送给某个进程
    • 2.1、键盘上发送,如ctrl+c,或者kill processid
    • 2.2、内存访问有问题,除数为0,硬件检测到,并通知内核

三、信号的名字,一般都是SIG开头

unix以及类unix系统(linux),支持的信号的数量各不相同
信号有名字,其实也是代表一些数字,正整数常量
#include<signal.h> (/usr/include)

使用如下命令即可寻找
find / -name "signal.h" | xargs grep -in "SIGHUP"

从根目录,找名字为 signal.h的文件,xargs:在内容中寻找SIGHUP字符串
find / -name "signal.h" | xargs grep -in "SIGHUP"
直接找到定义的文件,看到
#define SIGHUP           1
这就是一些宏定义

在这里插入图片描述
在这里插入图片描述

四、 通过kill来理解信号

可以查看kill的参数表,自行百度
kill -param processid,就是发了一个信号
1~32之间
kill -正数参数 pid
正数就是signal.h宏定义的信号
很多信号的缺省动作都是杀死进程
kill -1 pid :发送SIGHUP
kill -2 pid :发送SIGINT

五、附着进程

strace -e trace=signal -p pid
附着进程
可以查看该进程接收到了什么信号
如下面的一段代码:

int main()
{
	printf("hello world");
	for (; ; )
	{
		sleep(1);
		printf("进程正在运行\n");
	}
}

在bash1中执行该程序
在这里插入图片描述
在bash2中查看,并使用strace附着该进程,查看该进程收到的信号
在这里插入图片描述
在bash3中使用1->SIGHUP信号杀死该进程
在这里插入图片描述
在bash2中可以看到,收到了SIGHUP信号,被pid为7969杀死
在这里插入图片描述

  • 进程状态查看

    • ps -eo pid,ppid,sid,tty,pgrp,comm,stat | grep -E 'PID|LinuxTestC|bash'
    • ps aux | grep -E 'PID|LinuxTestC|bash'所谓BSD风格显示格式
      可以查询linux进程状态表可以查看
  • 常用信号列举

    • 1、默认动作,一般是杀死进程
    • 2、忽略此信号,但是不包括SIGKILL和SIGSTOP
      比如kill -9/SIGKILL pid,是一定能把进程杀死的
    • 3、捕捉该信号,写一个函数,进程该信号的特殊处理,但是yeshibubaokuoSIGKILL和SIGSTOP
发布了157 篇原创文章 · 获赞 167 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_40666620/article/details/103089882