快捷搜索:  汽车  科技

linux的信号有什么用(linux中信号机制相关介绍)

linux的信号有什么用(linux中信号机制相关介绍)1.3 信号产生的种类:表中第一列是各信号的宏定义名称,第二列是各信号的编号,第三列是默认处理动作Ign表示忽略该信号.Stop表示停止当前进程.Cont表示继续执行先前停止的进程.

1,信号的概念

1.1 信号编号:kill -l

linux的信号有什么用(linux中信号机制相关介绍)(1)

1.2 信号的机制:man 7 signal

linux的信号有什么用(linux中信号机制相关介绍)(2)

Term表示终止当前进程.

Core表示终止当前进程并且Core Dump(Core Dump 用于gdb调试.

Ign表示忽略该信号.

Stop表示停止当前进程.

Cont表示继续执行先前停止的进程.

linux的信号有什么用(linux中信号机制相关介绍)(3)

表中第一列是各信号的宏定义名称,第二列是各信号的编号,第三列是默认处理动作

1.3 信号产生的种类:

终端特殊按键:ctl c SIGINT ,ctl z SIGTSTP, ctl \ SIGQUIT

硬件异常:

  • 除0操作.
  • 访问非法内存.

kill函数或kill命令:

int kill(pid_t pid int sig) pid > 0 sig发送给ID为pid的进程 pid == 0 sig发送给与发送进程同组的所有进程 pid < 0 sig发送给组ID为|-pid|的进程,并且发送进程具有向其发送信号的权限 pid == -1 sig发送给发送进程有权限向他们发送信号的系统上的所有进程 sig为0时,用于检测,特定为pid进程是否存在,如不存在,返回-1.

int raise(int sig)

void abort(void)

某种软件条件已发生 定时器alarm到时 每个进程只有一个定时器:

unsigned int alarm(unsigned int seconds)

1.4 信号产生原因:

1) SIGHUP:当用户退出shell时,由该shell启动的所有进程将收到这个信号,默认动作为终止进程。

2)SIGINT:当用户按下了组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动 作为终止里程。

3)SIGQUIT:当用户按下组合键时产生该信号,用户终端向正在运行中的由该终端启动的程序发出些信 号。默认动作为终止进程。

4)SIGILL:CPU检测到某进程执行了非法指令。默认动作为终止进程并产生core文件

5)SIGTRAP:该信号由断点指令或其他 trap指令产生。默认动作为终止里程 并产生core文件。

6 ) SIGABRT:调用abort函数时产生该信号。默认动作为终止进程并产生core文件。

7)SIGBUS:非法访问内存地址,包括内存对齐出错,默认动作为终止进程并产生core文件。

8)SIGFPE:在发生致命的运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为0等所有的算法错误。默 认动作为终止进程并产生core文件。

9)SIGKILL:无条件终止进程。本信号不能被忽略,处理和阻塞。默认动作为终止进程。它向系统管理员提供了可 以杀死任何进程的方法。

10)SIGUSE1:用户定义 的信号。即程序员可以在程序中定义并使用该信号。默认动作为终止进程。

11)SIGSEGV:指示进程进行了无效内存访问。默认动作为终止进程并产生core文件。

12)SIGUSR2:这是另外一个用户自定义信号 ,程序员可以在程序中定义 并使用该信号。默认动作为终止进程。

13)SIGPIPE:Broken pipe向一个没有读端的管道写数据。默认动作为终止进程。

14) SIGALRM:定时器超时,超时的时间 由系统调用alarm设置。默认动作为终止进程。

15)SIGTERM:程序结束信号,与SIGKILL不同的是,该信号可以被阻塞和终止。通常用来要示程序正常退出。执行 shell命令Kill时,缺省产生这个信号。默认动作为终止进程。

16)SIGCHLD:子进程结束时,父进程会收到这个信号。默认动作为忽略这个信号。

17)SIGCONT:停止进程的执行。信号不能被忽略,处理和阻塞。默认动作为终止进程。

18)sigTTIN:后台进程读终端控制台。默认动作为暂停进程。

19)SIGTSTP:停止进程的运行。按下组合键时发出这个信号。默认动作为暂停进程。

21)SIGTTOU:该信号类似于SIGTTIN,在后台进程要向终端输出数据时发生。默认动作为暂停进程。

22)SIGURG:套接字上有紧急数据时,向当前正在运行的进程发出些信号,报告有紧急数据到达。如网络带外数据 到达,默认动作为忽略该信号。

23)SIGXFSZ:进程执行时间超过了分配给该进程的CPU时间 ,系统产生该信号并发送给该进程。默认动作为终止 进程。

24)SIGXFSZ:超过文件的最大长度设置。默认动作为终止进程。

25)SIGVTALRM:虚拟时钟超时时产生该信号。类似于SIGALRM,但是该信号只计算该进程占用CPU的使用时间。默 认动作为终止进程。

26)SGIPROF:类似于SIGVTALRM,它不公包括该进程占用CPU时间还包括执行系统调用时间。默认动作为终止进 程。

27)SIGWINCH:窗口变化大小时发出。默认动作为忽略该信号。

28)SIGIO:此信号向进程指示发出了一个异步IO事件。默认动作为忽略。

29)SIGPWR:关机。默认动作为终止进程。 30)SIGSYS:无效的系统调用。默认动作为终止进程并产生core文件。

31)SIGRTMIN~(64)SIGRTMAX:LINUX的实时信号,它们没有固定的含义(可以由用户自定义)。所有的实时信 号的默认动作都为终止进程。

2,进程处理信号行为

2.1 manpage里信号3种处理方式:

SIG_IGN ,SIG_DFL ,a signal handling function

2.2 进程处理信号的行为:

默认处理动作:term,core,ign,stop,cont

忽略

捕捉(用户自定义信号处理函数)

3,信号集处理函数

sigset_t为信号集 可sizeof(sigset_t)察看

int sigemptyset(sigset_t *set)

int sigfillset(sigset_t *set)

int sigaddset(sigset_t *set int signo)

int sigdelset(sigset_t *set int signo)

int sigismember(const sigset_t *set int signo)

4,PCB的信号集

4.1 sigprocmask

调用函数sigprocmask可以读取或更改进程的信号屏蔽字。

#include int sigprocmask(int how const sigset_t *set sigset_t *oset);

返回值:若成功则为0,若出错则为-1。

如果oset是非空指针,则读取进程的当前信号屏蔽字通过oset参数传出。如果set是非 空指针,则更改进程的信号屏蔽字,参数how指示如何更改。如果oset和set都是非空指针, 则先将原来的信号屏蔽字备份到oset里,然后根据set和how参数更改信号屏蔽字。假设当前 的信号屏蔽字为mask,下表说明了how参数的可选值。

how参数的含义

SIG_BLOCK set包含了我们希望添加到当前信号屏蔽字的信号,相当于mask=mask|set SIG_UNBLOCK set包含了我们希望从当前信号屏蔽字中解除阻塞的信号,相当于mask=mask&~set SIG_SETMASK 设置当前信号屏蔽字为set所指向的值,相当于mask=set

如果调用sigprocmask解除了对当前若干个未决信号的阻塞,则在sigprocmask返回前, 至少将其中一个信号抵达。

4.2 sigpending

#include int sigpending(sigset_t *set);

sigpending读取当前进程的未决信号集,通过set参数传出。调用成功则返回0,出错则 返回-1。

5,信号捕捉设定

自己了解下,没时间写了。。。点赞再写。。。。猝。。。

猜您喜欢: