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);

猜你喜欢

转载自blog.csdn.net/qq_38600065/article/details/107434154