C语言 NOTE31
作者:互联网
系统编程之信号
自定义信号处理方式函数带传参数和不带参数形式:
- 不带参数形式:
signal ( 设置信号处理方式 )
- 头文件 #include <signal.h>
- 定义函数
void (*signal(int signum, void(* handler)(int)))(int);
- 函数说明
signal()会依参数 signum 指定的信号编号来设置该信号的处理函数. 当指定的信号到达时就会跳转到参数 handler 指定的函数执行. 如果参数 handler 不是函数指针, 则必须是下列两个常数之一:
SIG_IGN 忽略参数 signum 指定的信号.
SIG_DFL 将参数 signum 指定的信号重设为核心预设的信号处理方式.
关于信号的编号和说明, 请参考附录 D - 返回值 返
回先前的信号处理函数指针, 如果有错误则返回 SIG_ERR(-1).
附加说明 在信号发生跳转到自定的 handler 处理函数执行后, 系统会自动将此处理函数换回原来系统预设的处理方式, 如果要改变此操作请改用 sigaction().
- 带传参数的形式
- sigaction (查询或设置信号处理方式)
相关函数 signal, sigprocmask, sigpending, sigsuspend - 头文件
#include <signal.h> - 定义函数
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
- 函数说明
sigaction()会依参数 signum 指定的信号编号来设置该信号的处理函数. 参数 signum 可以指定 SIGKILL 和 SIGSTOP 以外的所有信号. - 如参数结构 sigaction 定义如下:
struct sigaction
{
void (*sa_handler) (int);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer) (void);
}
参数 | 意义 |
---|---|
sa_handler | 此参数和 signal()的参数 handler 相同, 代表新的信号处理函数, 其他意义请参考signal(). |
sa_mask | 用来设置在处理该信号时暂时将 sa_mask 指定的信号搁置. |
sa_restorer | 此参数没有使用. |
sa_flags | 用来设置信号处理的其他相关操作, 下列的数值可用.OR 运算 组合 |
A_NOCLDSTOP: | 如果参数 signum 为 SIGCHLD, 则当子进程暂停时并不会通知父进程 |
SA_ONESHOT/SA_RESETHAND: | 当调用新的信号处理函数前, 将此信号处理方式改为系统预设的方式. |
SA_RESTART: | 被信号中断的系统调用会自行重启 |
SA_NOMASK/SA_NODEFER: | 在处理此信号未结束前不理会此信号的再次到来. 如果参数oldact 不是 NULL 指针, 则原来的信号处理方式会由此结构 sigaction 返回. |
SA_SIGINFO |
- 返回值
执行成功则返回 0, 如果有错误则返回-1.
错误代码 EINVAL 参数 signum 不合法, 或是企图拦截 SIGKILL/SIGSTOPSIGKILL 信号EFAULT 参数 act, oldact 指针地址无法存取.EINTR 此调用被中断
标签:信号处理,C语言,参数,信号,signum,NOTE31,sigaction,sa 来源: https://blog.csdn.net/weixin_42191545/article/details/104180613