C语言pthread线程传递文件名后程序结束报abort错误如何解决
问题原因分析
你遇到的运行结束abort问题核心是栈缓冲区溢出/非法内存访问导致的栈结构被破坏,程序退出时系统检测到栈损坏触发abort,具体有几个问题点:
- 变量
k未初始化也没有做合法校验:
你在每轮时间片循环中,只有当找到满足条件的进程时才会给k赋值,如果某轮循环没有已到达且未执行完的进程(比如初始时刻所有进程到达时间都大于当前时间、或者进程已经全部执行完),k就是栈上的随机垃圾值,后续执行BT[k]--就会越界访问栈内存,直接破坏栈结构。 - 硬编码的缓冲区过小存在溢出风险:
文件名数组fileName仅定义了10字节长度,最多只能存9个字符的文件名,输入文件名稍长就会发生栈溢出;读取文件行的line数组10字节、存储执行序列的PR数组固定100长度,都存在溢出可能。 - 排序逻辑不完整:
你按到达时间排序时只交换了AT和BT数组,对应的PT数组没有同步交换,虽然目前不会触发崩溃,但后续如果用到优先级参数就会出错。
修复方案
你可以按以下步骤修改代码:
- 给k增加合法校验,处理CPU空闲的情况
在每轮时间片循环中增加标记位,确认找到有效进程后再操作对应的数组:
for (i=0; i<totalBurst; i++) { small = 3200; int found = 0; // 新增标记位 for (j=0; j<numProcess; j++) { if ((BT[j] != 0) && (AT[j] <=i) && (BT[j]<small)) { small = BT[j]; k = j; found = 1; // 标记找到有效进程 } } if (!found) continue; // 没有找到有效进程直接跳过本轮 BT[k]--; PR[i] = k; }
- 放大所有缓冲区长度,避免溢出
把主函数和SRTF函数里的fileName数组长度改成256,line数组长度改成256;PR数组可以改成动态分配,根据计算得到的totalBurst大小申请内存:
// 读取完所有进程的burst时间后再申请PR数组 int *PR = (int*)malloc(sizeof(int) * totalBurst); // 程序结束前释放内存 free(PR);
- 完善排序逻辑,同步交换PT数组
if(AT[i] > AT[j]) { swap = AT[i]; AT[i] = AT[j]; AT[j] = swap; swap = BT[i]; BT[i] = BT[j]; BT[j] = swap; swap = PT[i]; // 新增PT数组交换 PT[i] = PT[j]; PT[j] = swap; }
- 增加fopen失败校验,避免空指针操作
打开文件后判断fp是否为NULL,为空直接返回错误:
fp = fopen(fileName,"r"); if (fp == NULL) { printf("文件打开失败\n"); return NULL; }
内容的提问来源于stack exchange,提问作者TM9656
相关产品推荐
相关产品推荐

