Linux系统之信号signal简介

Linux系统之信号signal简介

常见信号
信号含义
SIGABORT进程异常终止
SIGALRM超时警告
SIGFPE浮点运算异常
SIGHUP连接挂断
SIGILL非法指令
SIGINT终端中断
SIGKILL终止进程(此信号无法被捕获或忽略)
SIGPIPE向无读进程的管道写数据
SIGQUIT终端退出
SIGSEGV无效内存访问
SIGTERM终止
SIGUSR1用户定义信号1
SIGUSR2用户定义信号2
SIGCHLD子进程已经停止或退出(默认被忽略)
SIGCONT继续执行暂停进程
SIGSTOP停止执行(此信号无法被捕获或忽略)
SIGTSTP终端挂起
SIGTTIN后台进程尝试读操作
SIGTTOU后台进程尝试写操作

在上述信号中,除了SIGCHLD、SIGCONT之外,其余的信号若没有实现安排捕获,则进程会立刻终止。

signal函数

signal函数为指定信号绑定处理该信号的函数,函数原型如下:

#include<signal.h>

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

参数说明:

  • sig:指定准备或忽略的信号
  • func:接收到指定的信号后要调用的函数,有两个特殊值如下:
特殊值作用
SIG_IGN忽略信号
SIG_DFL恢复默认行为
kill函数

kill函数可以向包括它本身在内的其它进程发送一个信号:

#include<sys/types.h>
#include<signal.h>

int kill(pid_t pid, int sig);

参数说明:

  • pid:指定接收信号的进程id
  • sig:要发送的信号
alarm函数:

alarm函数用来在指定时间之后向自身发送一个SIGALRM信号:

#include<unistd.h>

unsigned int alarm(unsigned int seconds);

由于处理的延时和时间调度的不确定性,实际闹钟时间将比预先安排的要稍微延后。需要注意的是,每个进程只有一个闹钟时间,若在接收到SIGALRM信号之前再次调用alarm函数,则闹钟重新开始计时。

pause函数

pause的作用是把程序的执行挂起直到有一个信号出现为止:

#include<unistd.h>

int pause(void);
sigaction函数:

sigaction函数指定在接收到参数sig指定的信号后应该采取的行动:

#include<signal.h>

int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);

struct sigaction{
    void (*) (int) sa_handler;      #信号处理函数指针
    sigset_t sa_mask;               #被阻塞的信号集合
    int sa_flags;                   #标志位
};

参数说明:

  • sig:指定要处理的信号
  • act:定义接受到信号后应该采取的行动
  • oact:若不为空,则将原先对该信号的动作写到其指向的位置

sigaction结构中的sa_mask成员指定了一个信号集,在调用sa_handler所指向信号处理函数之前,该信号集将被加入到进程的信号屏蔽字中,这些信号将被阻塞且不会传递给该进程的信号。设置信号屏蔽字可以防止前面看到的信号在它的处理函数还未运行结束时就被接收到的情况。

sigaction标志值及其作用:

标志值作用
SA_NOCLDSTOP子进程停止时不产生SIGCHLD信号
SA_RESETHAND将对此信号的处理方式在信号处理函数的入口处重置为SIG_DFL
SA_RESTART重启可中断的函数而不是给出EINTR错误
SA_NODEFER捕获到信号时不将它添加到信号屏蔽字中
信号集相关函数
#include<signal.h>

int sigaddset(sigset_t *set, int signo);    #将某个信号添加到信号集中
int sigemptyset(sigset_t *set);             #将信号集初始化为空
int sigfillset(sigset_t *set);              #将信号集初始化为包含所有已定义的信号
int sigdelset(sigset_t *set, int signo);    #将某个信号从信号集中删去
int sigismember(sigset_t *set, int signo);      #判断一个信号是否在信号集中
sigprocmask函数

sigprocmask函数可以根据参数how指定的方法修改进程的信号屏蔽字。新的信号屏蔽字由参数set指定,而原先的信号屏蔽字将保存到信号集oset中。

#include<signal.h>

int sigprocmask(int how, const sigset_t *set, sigset_t *oset);

参数how的取值如下:

参数作用
SIG_BLOCK把参数set中的信号添加到信号屏蔽字中
SIG_SETMASK把信号屏蔽字设置为参数set中的信号
SIG_UNBLOCK从信号屏蔽字中删除参数set中的信号
sigpending函数

sigpending函数的作用是将被阻塞的信号中停留在待处理状态的一组信号写到参树set指向的信号集中。

#include<signal.h>

int sigpending(sigset_t *set);
sigsuspend函数

sigsuspend函数将进程的屏蔽字替换为由参数sigmask给出的信号集,然后挂起程序的执行,程序将在信号处理函数执行完毕后继续执行。

#include<signal.h>

int sigsuspend(const sigset_t *sigmask);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值