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

相关推荐
倔强的石头1062 分钟前
【Linux指南】用户与系统基础操作
linux·运维·服务器
好多知识都想学15 分钟前
Centos 7 服务器部署多网站
linux·服务器·centos
藥瓿亭1 小时前
K8S认证|CKS题库+答案| 10. Trivy 扫描镜像安全漏洞
linux·运维·服务器·云原生·容器·kubernetes·cks
leo__5201 小时前
在Ubuntu中设置开机自动运行(sudo)指令的指南
服务器·ubuntu·postgresql
rui锐rui2 小时前
大模型模型部署和暴露接口
linux·运维·服务器
Clownseven2 小时前
云防火墙(安全组)配置指南:从入门到精通端口开放 (2025)
服务器·安全
码农101号12 小时前
Linux中shell编程表达式和数组讲解
linux·运维·服务器
是小满满满满吗13 小时前
传输层:udp与tcp协议
linux·服务器·网络
Mintimate14 小时前
云服务器 Linux 手动 DD 安装第三方 Linux 发行版:原理与实战
linux·运维·服务器
RussellFans14 小时前
Linux 环境配置
linux·运维·服务器