第十五章 创建Callout Library - 处理 UNIX 信号处理错误

文章目录

  • [第十五章 创建Callout Library - 处理 UNIX 信号处理错误](#第十五章 创建Callout Library - 处理 UNIX 信号处理错误)
  • [处理 `UNIX` 信号处理错误](#处理 UNIX 信号处理错误)

第十五章 创建Callout Library - 处理 UNIX 信号处理错误

处理 UNIX 信号处理错误

UNIX 及相关操作系统下运行时,如果进程收到信号,某些系统调用可能会失败,最常见的是打开、读取、写入、关闭、ioctl 和暂停。如果函数使用任何这些系统调用,代码必须能够区分真正的错误、Ctrl-C 和应重新启动的调用。

以下函数允许检查异步事件并在 $ZF 中设置新的警报处理程序。函数声明包含在 iris-cdzf.h 中:

sigrtclr()

int sigrtclr(); --- 清除重试标志。应在使用 sigrtchk() 之前调用一次。

dzfalarm()

int dzfalarm(); --- 建立新的 `SIGALRM 处理程序。

进入 $ZF 时,会自动保存先前的处理程序。退出时会自动恢复。用户程序不应改变任何其他信号的处理。

sigrtchk()

int sigrtchk(); --- 检查异步事件。每当以下系统调用之一失败时就应该调用:open、close、read、write、ioctl、pause 或进程收到信号时失败的任何调用。它返回一个代码,指示用户应采取的操作:

  • -1 --- 不是信号。检查 I/O 错误。查看 errno 变量的内容。
  • 0 --- 其他信号。从中断点重新开始操作。
  • 1 --- SIGINT/SIGTERM。使用 SIGTERM"return 0"退出 $ZF。这些信号被适当地捕获。

用于控制某些设备的典型 $ZF 函数将使用类似于以下伪代码的逻辑:

java 复制代码
if ((fd = open(DEV_NAME, DEV_MODE)) < 0) {
    Set some flags
    Call zferror
    return 0;
}

如果进程收到信号,open 系统调用可能会失败。通常这种情况不是错误,应该重新启动操作。但是,根据信号,可能会采取其他操作。因此,为了考虑所有可能性,请考虑使用以下代码:

复制代码
sigrtclr();
while (TRUE) {
    if (sigrtchk() == 1) return 1 or 0;
    if ((fd = open(DEV_NAME, DEV_MODE)) < 0) {
        switch (sigrtchk()) {
             case -1:
                /* This is probably a real device error */
                Set some flags
                Call zferror
                return 0;
            case 0:
                /* A innocuous signal was received. Restart. */
                continue;
            case 1:
                /* Someone is trying to terminate the job. */
                Do cleanup work
                return 1 or 0;
        }
    }
    else break;
}
/*
Code to handle the normal situation:
open() system call succeeded
*/

注意:记住:错误处理代码绝不能改变信号的处理,除非调用 dzfalarm() 来建立新的 SIGALRM 处理程序。

相关推荐
Horn Still Sounds42 分钟前
Linux网络并发服务器模型与SQLite数据库学习笔记
linux·服务器·数据库
10mAh1 小时前
【Linux】CPU 100% 怎么排查?——top、pidstat、jstack 到线程定位实战
linux·运维·服务器
2601_966799041 小时前
酷嗨米J300:硬件级多通道分发采集设备,为矩阵直播打造独立信号通道
服务器·网络·负载均衡
落樱弥城1 小时前
RHI 设计考量:不同 API 差异分析
服务器·前端·性能优化
Titan20242 小时前
网络基础:传输层协议知识梳理
linux·服务器·网络
爱吃提升2 小时前
VMware虚拟机迁移系统磁盘完整教程(VMware Workstation17)
linux·运维·服务器
诸葛李2 小时前
linux 配置
linux·运维·服务器
TechWayfarer2 小时前
做IP归属地查询时总是查不准?IP纯净度检测实战:从“查归属地“到识别“脏IP“的四个维度
服务器·网络·python·tcp/ip·安全·web安全
Aime_Perfect2 小时前
sqlserver always on
服务器·数据库·sqlserver
BestHeaker3 小时前
跨企业接口对接:IQDS / CPK 数据解析与协作避坑指南(五)
java·服务器·前端