第十五章 创建Callout Library - 处理 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 — 其他信号。从中断点重新开始操作。
  • 1SIGINT/SIGTERM。使用 SIGTERM“return 0”退出 $ZF。这些信号被适当地捕获。

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

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. SOAP 错误处理

    2024-01-08 16:20:03       6 阅读
  2. 锁定 Apache (UNIX® Linux macOS)

    2024-01-08 16:20:03       10 阅读
  3. 4:GO的错误处理机制

    2024-01-08 16:20:03       10 阅读
  4. 学习 Rust 的天:如何处理程序异常信息

    2024-01-08 16:20:03       11 阅读
  5. :CSS预处理器入门

    2024-01-08 16:20:03       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-08 16:20:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-08 16:20:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-08 16:20:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-08 16:20:03       20 阅读

热门阅读

  1. 再读Bob大叔三部曲之代码整洁之道

    2024-01-08 16:20:03       40 阅读
  2. Spring Boot 生产就绪中文文档-上

    2024-01-08 16:20:03       42 阅读
  3. Python实现大数据量对比

    2024-01-08 16:20:03       45 阅读
  4. 泛型擦除到底是怎么一回事

    2024-01-08 16:20:03       41 阅读
  5. 条款34:区分接口继承和实现

    2024-01-08 16:20:03       32 阅读
  6. es相关介绍:yml配置、基础接口及方法介绍

    2024-01-08 16:20:03       34 阅读