linux signal之初学篇

时间:2021-09-26 03:50:07

前言

本博文只总结signal的应用,对signal的kernel实现暂不讨论。

1. linux signal是什么?

signal是linux提供的用于进程间通信的一种IPC机制。

2. 如何发送signal来实现IPC?

使用kill命令或kill函数可以发指定的进程发送signal。

kill -0 pid,没有id为0的signal,通常这个命令仅仅是用来测试进程号为pid对应的进程是否存在;

不过使用ps -A | grep pid应该同样可以做这项测试。

kill -9 pid,强制杀掉一个进程。

对于linux管理员来讲,经常会搭配ps/pstree/top等命令来查找系统中异常的进程并将其杀死。

kill pid,如果没有指定某个signal,那默认会送SIGTERM给pid对应的进程。

3. signal被如何处理?

#include <signal.h>

signal通常有三种处理方式:

(1)显示的ignore,

signal(SIGTSTP, SIGIGN);

这样子的话你的进程就会收到这条signal,但是处理的方式是ignore;

(2)你的进程可能会对某个特定的signal感兴趣,这时就可以捕获这个signal并去处理它,

struct sigaction t_act, t_oldact;
t_act.sa_flags = SA_NODEFER;
t_act.sa_sigaction = _my_signal_hander;
sigaction(SIGUSR1, &t_act, &t_oldact);
static void _my_signal_handler()
{
    /* do your thing */
}

(3)按照默认的方式处理,这样kernel会按照已经预设好的流程来处理这个signal。

4. 如何确定每一条signal对应的num,比如SIGUSR1对应的num值是多少?

请看signal.h这个header file

#define SIGHUP 1

#define SIGUSR1 10

在shell下面kill -10 pid与kill SIGUSR1 pid作用是一样的。

5. signal的应用?

待补充。