综合百科

c语言signal函数的应用

C语言中的signal函数用于设置信号处理函数,其语法如下:

```c

void (*signal(int sig, void (*func)(int)))(int);

```

其中,sig表示要设置的信号,func是信号处理函数。

signal函数的应用包括:

1. 捕捉信号:使用signal函数可以捕捉特定的信号,如SIGINT(中断信号)和SIGTERM(终止信号),并在捕捉到信号时执行相应的处理函数。

2. 防止子进程变成僵尸进程:在父进程中使用signal函数将SIGCHLD信号设置为忽略,可以防止子进程变成僵尸进程。

3. 定时器:使用signal函数结合setitimer函数可以实现定时器功能,即在指定的时间间隔内执行指定的操作。

4. 多线程同步:在多线程程序中,使用signal函数可以向指定线程发送信号,实现线程之间的同步和通信。

需要注意的是,不同的操作系统可能支持的信号种类和处理方式不同,需要根据实际情况进行选择和使用。

signal是一个系统调用。是一种特殊的中断,当某种特定的“软件中断”发生时。用于调用的程序。中断通常是程序运行中出现的特殊情况,如引用特殊内存中的非法地址, 浮点数被0除。

signal()的原型为:

#include <signal.h>

void(*signal(int hum,void(*func)(int)))(int)。

signal中的int參数及其含义

SIGHUP 1 A 终端挂起或者控制进程终止

SIGINT 2 A 键盘中断(如break键被按下)

SIGQU99v 3 C 键盘的退出键被按下

SIGILL 4 C 非法指令

SIGABRT 6 C 由abort(3)发出的退出指令

SIGFPE 8 C 浮点异常

SIGKILL 9 AEF Kill信号

SIGSEGV 11 C 无效的内存引用

SIGPIPE 13 A 管道破裂: 写一个没有读port的管道

SIGALRM 14 A 由alarm(2)发出的信号

SIGTERM 15 A 终止信号

SIGUSR1 30,10,16 A 用户自己定义信号1

SIGUSR2 31,12,17 A 用户自己定义信号2

SIGCHLD 20,17,18 B 子进程结束信号

SIGCONT 19,18,25 进程继续(曾被停止的进程)

SIGSTOP 17,19,23 DEF 终止进程

SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键

SIGTTIN 21,21,26 D 后台进程企图从控制终端读

SIGTTOU 22,22,27 D 后台进程企图从控制终端写

以下的信号没在POSIX.1中列出,而在SUSv2列出

SIGBUS 10,7,10 C 总线错误(错误的内存訪问)

SIGPOLL A Sys V定义的Pollable事件,与SIGIO同义

SIGPROF 27,27,29 A Profiling定时器到

SIGSYS 12,-,12 C 无效的系统调用 (SVID)

SIGTRAP 5 C 跟踪/断点捕获

SIGURG 16,23,21 B Socket出现紧急条件(4.2 BSD)

SIGVTALRM 26,26,28 A 实际时间报警时钟信号(4.2 BSD)

SIGXCPU 24,24,30 C 超出设定的CPU时间限制(4.2 BSD)

SIGXFSZ 25,25,31 C 超出设定的文件限制大小(4.2 BSD)

(对于SIGSYS。SIGXCPU。SIGXFSZ。以及某些机器体系结构下的SIGBUS,Linux缺省的动作是A (terminate),SUSv2 是C (terminate and dump core))。

以下是其他的一些信号

信号 值 处理动作 发出信号的原因

SIGIOT 6 C IO捕获指令,与SIGABRT同义

SIGEMT 7,-,7

SIGSTKFLT -,16,- A 协处理器堆栈错误

SIGIO 23,29,22 A 某I/O操作如今能够进行了(4.2 BSD)

SIGCLD -,-,18 A 与SIGCHLD同义

SIGPWR 29,30,19 A 电源故障(System V)

SIGINFO 29,-,- A 与SIGPWR同义

SIGLOST -,-,- A 文件锁丢失

SIGWINCH 28,28,20 B 窗体大小改变(4.3 BSD, Sun)

SIGUNUSED -,31,- A 未使用的信号(will be SIGSYS)。