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

WSL Ubuntu环境下C语言文件操作程序崩溃问题求助

WSL Ubuntu中C程序文件打开失败崩溃的问题分析与修复

核心问题:路径格式错误

Windows系统用反斜杠\做路径分隔符,而Linux(包括WSL Ubuntu)用正斜杠/。你代码里的\\wsl.localhost\\Ubuntu\\home\\asevic\\lab1\\obrada.txt是Windows访问WSL文件的路径格式,在WSL内部的Linux环境中完全无效——WSL的文件系统里根本不存在\\wsl.localhost这个目录,自然打不开文件,导致程序输出Error!后直接退出。

正确的路径写法要改用Linux格式:

  • 绝对路径:"/home/asevic/lab1/obrada.txt"
  • 相对路径(如果程序在lab1目录下编译运行):"./obrada.txt" 或直接 "obrada.txt"

次要问题:fopen的r+模式限制

r+模式要求文件必须已存在才能打开读写,如果目标文件不存在,fopen会返回NULL。你的程序没处理文件不存在的情况,只要obrada.txt或status.txt未创建,就会触发错误退出。

如果需要文件不存在时自动创建,可根据场景调整模式:

  • 用"w+":会创建文件,但会清空已有内容(不适合需要保留历史数据的场景)
  • 先检查文件是否存在,不存在则用"w"创建,再重新用"r+"打开
  • 用"a+":允许读写,文件不存在时创建,写入会追加到末尾(需注意调整读取位置)

缺失需求:信号处理逻辑

你的任务要求程序处理SIGINT(Ctrl+C)、SIGTERM等信号,但当前代码完全没有相关实现。可以通过signal()或sigaction()函数注册信号处理函数,确保程序收到信号时能优雅退出(比如关闭文件、保存状态)。

修复后的代码示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

FILE *fptr1, *fptr2;

// 信号处理函数,确保退出前关闭文件
void handle_signal(int sig) {
    printf("\n收到信号%d,正在退出...\n", sig);
    if (fptr1) fclose(fptr1);
    if (fptr2) fclose(fptr2);
    exit(0);
}

int main() {
    // 注册SIGINT和SIGTERM信号处理
    signal(SIGINT, handle_signal);
    signal(SIGTERM, handle_signal);

    int n = 0;

    // 使用Linux相对路径(假设程序在lab1目录下运行)
    fptr1 = fopen("./obrada.txt", "a+");
    fptr2 = fopen("./status.txt", "a+");

    if (fptr1 == NULL) {
        perror("打开obrada.txt失败");
        exit(1);
    }
    if (fptr2 == NULL) {
        perror("打开status.txt失败");
        exit(2);
    }

    // 将文件指针移到开头,读取最后一个数字
    rewind(fptr2);
    while (fscanf(fptr2, "%d", &n) == 1);

    printf("Program s PID=%ld krenuo s radom\n", (long)getpid());
    printf("The last number in the file is: %d\n", n);

    int kv, counter = n + 1;
    int i;
    for (i = n + 1; i < 1000; ++i) {
        kv = i * i;
        fprintf(fptr1, "%d\n", kv);
        fprintf(fptr2, "%d\n", counter);
        printf("Next square value: %d\n", kv);
        counter++;
        // 刷新缓冲区,确保内容及时写入文件
        fflush(fptr1);
        fflush(fptr2);
        sleep(3);
    }

    printf("Program ends\n");
    fclose(fptr1);
    fclose(fptr2);
    return 0;
}

额外建议

  1. 编译时加警告参数:gcc program.c -o program -Wall,能帮你发现更多潜在问题
  2. 用perror()替代简单的printf("Error!"),它会输出具体错误原因(比如文件不存在、权限不足等)
  3. 运行程序前,确保当前工作目录是/home/asevic/lab1,或者直接使用绝对路径

内容的提问来源于stack exchange,提问作者Adrian Sevic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:24:53