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

相关推荐
captain3762 分钟前
网络初 识
运维·服务器·网络
kyle~10 分钟前
Linux --- epoll (I/O就绪事件通知机制)
linux·运维·服务器
z落落3 小时前
C# WinForm Socket 转串口设备服务器+Modbus CRC16校验+Socket 客户端
服务器·开发语言·c#
刚入门的大一新生12 小时前
Linux-进程控制
linux·运维·服务器·c++
上火的金鱼妹12 小时前
K8S基础组件作用和关系整理
linux·运维·服务器·kubernetes
醉颜凉13 小时前
网络安全必学:粘性MAC地址(Sticky MAC)原理与应用全解析
运维·服务器·网络·安全·web安全
晊晌_h13 小时前
嵌入式从0到精通——Linux C|TCP 并发服务器实现方案详解
服务器·开发语言·tcp/ip
广州灵眸科技有限公司14 小时前
从手动三步到上电即连:4G模组systemd开机自连方案
linux·运维·服务器·开发语言·网络·人工智能·php
深念Y14 小时前
【保姆级教程】Proxmox VE (PVE) 安装 FreeBSD 完整指南
服务器·unix·系统·pve·freebsd·虚拟化平台
子非鱼a15 小时前
【WEB】[SWPU2019]Web1
java·服务器·前端