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()函数实现延迟,该函数不会触发信号,完全规避信号异常风险。
- 若在Guardian运行环境下开发,引入头文件
- 调整缓冲区刷新逻辑,每次
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
相关产品推荐
相关产品推荐

