信号是一种软件终端,它提供了一种处理异步事件的方法,也是进程间唯一的异步通信方式
信号来源
1、硬件方式
- 用户按下中断的某些键
- 硬件异常产生信号:除0操作、访问非法空间等
2、软件方式
- 用户在终端调用kill命令向进程发送任意信号
- 进程调用kill或sigqueue函数发送信号
- 检测到某种条件发生时
信号相关的几个函数
signal函数
1、 signal函数用来设置进程在接收到信号时的动作
2、 函数原型:
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
//signum信号
//handler处置函数
sigaction函数
1、sigction函数可以用来检查和设置进程在接收信号时的动作。
2、函数原型
#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
kill函数
1、 kill函数用来发送信号给指定进程
2、 函数原型
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
该函数的行为与第二个参数pid的取值有关,第二个参数sig表示信号编号:
- 如果pid时正数,则发送信号sig给进程号为pid的进程;如果pid为0,则发送信号sig给当前进程所属进程组里的所有进程;
- 如果pid为-1,则把信号sig广播给系统内的除1号进程和自身以外的所有进程;
- 如果pid为比-1还小的负数,则发送信号sig给属于进程组-pid的所有进程;
- 如果参数sig是0,则kill(),仍然执行正常的错误检查,但不发送信号。可以利用这一点来确定某 进程是否有权向另外一个进程发送信号。如果向一个并不存在的进程发送空信号,则kill()返回-1,errno则被设置为ESRCH。
注意:只有具有root权限的进程才能向其他任意一个进程发送信号,非root权限的进程只能向属于同一个组成或者同一个用户创建的进程发送信号。
raise函数
1、 raise函数时ANSI C而非POSIX标准定义的
2、 它被用来给调用它的进程发送信号
3、 函数原型:
#include <signal.h>
int raise(int sig);
sigqueue函数
1、 它支持信号带有参数,从而可以与函数sigaction配合使用。
2、 sigqueue用来发送信号sig给进程pid。
3、 函数原型:
#include <signal.h>
int sigqueue(pid_t pid, int sig, const union sigval value);
它和kill的不同点由:
- sigqueue支持信号携带参数
- sigqueue不能给一组进程发送信号
alarm函数
1、 alarm函数可以用来设置定时器,定时器超市将产生SIGALARM信号给调用进程。
2、 函数原型
#include <unistd.h>
unsigned int alarm(unsigned int seconds); //设定的秒数,如果seconds为0,就不再发送SIGALARM信号。
最新一次调用alarm函数将取消之前一次的设定
abort函数
1、 abort函数用来向进程发送SIGABORT信号
2、 函数原型:
#include <stdlib.h>
void abort(void)