You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言sleep()函数在HP NonStop(Tandem)平台运行异常问题

问题根因
  • HP NonStop(Tandem)平台标准C库的sleep()函数基于SIGALRM信号实现,该平台默认未处理SIGALRM信号的动作是直接终止进程并抛出ABENDED异常。由于信号触发时机受进程调度影响存在随机性,因此每次返回的异常编号都不相同。
  • 你的代码中仅在第二次printf后调用fflush(stdout),第一次输出的内容会滞留在stdio行缓冲区内,sleep触发信号时会破坏缓冲区的内部运行状态,进一步加剧未定义行为的发生。
  • 代码中main函数没有显式添加返回值,不符合C语言标准要求,在HP NonStop的严格运行时检查机制下也会引入异常风险。
修复方案
  • 优先使用HP NonStop平台原生的无信号依赖的延迟接口替换sleep():
    • 若在Guardian运行环境下开发,引入头文件<cextdecs.h>,调用DELAY()函数实现延迟,参数单位为厘秒(1厘秒=10毫秒),例如延迟5秒可写为DELAY(500)。
    • 若在OSS运行环境下开发,使用nanosleep()函数实现延迟,该函数不会触发信号,完全规避信号异常风险。
  • 调整缓冲区刷新逻辑,每次printf操作后要么添加\n换行符触发行缓冲自动刷新,要么显式调用fflush(stdout),避免缓冲区残留数据引发异常。
  • 给main函数添加显式的return 0;语句,符合C标准规范。
修复后代码示例(Guardian环境)
#include <stdio.h>
#include <stdlib.h>
#include <cextdecs.h>

int main()
{
   int i;
   for(i=0;i<10;i++)
   {
     printf("Something\n");
     // 延迟5秒,参数单位为厘秒
     DELAY(500);
     printf("Something\n");
     fflush(stdout);
   }
   return 0;
}

内容的提问来源于stack exchange,提问作者skillet-boy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:54:03