第十五章 创建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 处理程序。

相关推荐
风落无尘1 小时前
《智能重生:从垃圾堆到AI工程师》——第五章 代码与灵魂
服务器·网络·人工智能
南境十里·墨染春水5 小时前
linux学习笔记 网络编程——Socket入门与TCP客户端/服务器实现
linux·服务器·网络
Sirens.5 小时前
twikoo:从MongoDB Atlas到本地部署
运维·服务器
DFT计算杂谈6 小时前
自动化脚本一键绘制三元化合物相图
java·运维·服务器·开发语言·前端·python·自动化
Yupureki6 小时前
《Linux网络编程》6.UDP原理
linux·运维·服务器·网络·udp
楼田莉子6 小时前
Linux网络:NAT_代理
linux·运维·服务器·开发语言·c++·后端
fish_xk8 小时前
Linux的权限
linux·运维·服务器
Sirens.11 小时前
Umami:从Cloud迁移到服务器
运维·服务器
练习时长一年11 小时前
分页插件冲突问题
服务器·前端·windows
春蕾夏荷_72829772511 小时前
2、c++ acl tcp服务器客户端简单实例-服务器端(1)
服务器·c++·tcp/ip