Linux的signal.h头文件包含了一系列与信号处理相关的函数。以下是一些主要的函数及其简要描述:
int signal(int signum, void (*handler)(int)):
功能:为指定的信号注册一个处理函数。
参数:signum 是信号的编号,handler 是当信号发生时被调用的函数。
返回值:成功时返回之前的信号处理函数,失败时返回 SIG_ERR。
void (signal(int signum, void (handler)(int)))(int):
功能:这是一个带有默认参数的函数,用于查询或设置信号处理函数。
参数:如果 handler 是 SIG_IGN,则忽略该信号;如果 handler 是 SIG_DFL,则使用默认的信号处理函数;否则,使用 handler 作为信号处理函数。
返回值:返回之前的信号处理函数。
int raise(int signum):
功能:向当前进程发送一个信号。
参数:signum 是要发送的信号的编号。
返回值:成功时返回0,失败时返回-1。
int sigblock(int mask) 和 int sigsetmask(int mask):
功能:更改被阻塞的信号集。sigblock 是旧式的函数,sigsetmask 是其替代品。
参数:mask 是一个位掩码,表示被阻塞的信号。
返回值:成功时返回之前的信号掩码,失败时返回-1。
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset):
功能:检查或更改被阻塞的信号集。
参数:how 指定如何更改信号集,set 是新的信号集,oldset 用于存储旧的信号集。
返回值:成功时返回0,失败时返回-1。
int sigpending(sigset_t *set):
功能:检查当前进程待处理的信号集。
参数:set 用于存储待处理的信号集。
返回值:成功时返回0,失败时返回-1。
int sigsuspend(const sigset_t *set):
功能:更改被阻塞的信号集,并暂停进程执行,直到接收到一个信号。
参数:set 是新的信号集。
返回值:总是返回-1,并设置 errno 为 EINTR。
int sigemptyset(sigset_t *set), int sigfillset(sigset_t *set), int sigismember(const sigset_t *set, int signum):
功能:操作信号集。
sigemptyset 清空信号集,sigfillset 填充信号集,sigismember 检查信号是否在信号集中。
返回值:成功时返回0,失败时返回-1。
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact):
功能:检查或更改指定信号的处理行为。
参数:signum 是信号编号,act 是新的信号行为,oldact 用于存储旧的信号行为。
返回值:成功时返回0,失败时返回-1。
这些函数提供了在Linux程序中处理信号的基本能力。使用这些函数,程序员可以注册信号处理函数,发送信号,以及查询和修改信号的处理行为。需要注意的是,信号处理在并发和异步编程中是一个非常重要的主题,需要谨慎处理以避免竞态条件和死锁等问题。
在Linux中,信号处理是一个非常重要的机制,用于响应异步事件。Linux系统支持多种类型的信号,每种信号都有其特定的编号和名称。这些信号可以分为几类,每类信号都有其特定的用途和行为。
以下是一些常见的Linux信号类型及其简要描述:
终止信号 (Termination Signals):
SIGINT (信号2): 由用户通过键盘产生的中断信号,通常是Ctrl+C。
SIGQUIT (信号3): 由用户通过键盘产生的退出信号,通常是Ctrl+\。
SIGKILL (信号9): 强制终止进程的信号,不能被进程捕获或忽略。
SIGTERM (信号15): 请求进程终止的信号,可以被进程捕获并处理。
挂起信号 (Suspension Signals):
SIGSTOP (信号17): 停止进程的执行。
SIGTSTP (信号20): 停止进程的执行,通常与终端控制相关。
SIGTTIN (信号21): 后台进程尝试读取终端时发送。
SIGTTOU (信号22): 后台进程尝试写入终端时发送。
继续信号 (Continuation Signals):
SIGCONT (信号19): 继续执行之前被SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU停止的进程。
程序异常信号 (Program Exception Signals):
SIGSEGV (信号11): 进程访问了无效的内存地址。
SIGFPE (信号8): 进程发生了浮点异常,如除以零。
SIGILL (信号4): 进程执行了非法指令。
SIGABRT (信号6): 由进程自身通过abort函数发送的终止信号。
其他信号:
SIGCHLD (信号17): 子进程结束时发送给父进程的信号。
SIGALRM (信号14): 由alarm函数设置的定时器到期时发送。
SIGURG (信号16): 表示有紧急数据待处理,通常与套接字相关。
除了上述常见的信号外,Linux还支持其他多种信号,每种信号都有其特定的用途和行为。可以使用kill -l命令查看当前系统所支持的所有信号列表。
需要注意的是,进程可以注册信号处理函数来响应这些信号,也可以显式地发送信号给其他进程。信号处理函数可以自定义信号的行为,例如忽略信号、终止进程、执行清理操作等。然而,某些信号(如SIGKILL和SIGSTOP)是不可捕获或忽略的,它们的行为是固定的。
标签:set,函数,--,signal,int,信号,Linux,进程,信号处理 From: https://www.cnblogs.com/yubo-guan/p/18010807