如何解决Unix上读取文件时退出代码139错误

j2qf4p5b  于 2022-10-17  发布在  Unix
关注(0)|答案(4)|浏览(331)

所以我相信这只是Unix上的一个问题,如果Clion调试器是正确的,那么它会在第一个fscanf出现,但是我不知道为什么我得到了错误--进程以退出代码139结束(被信号11:SIGSEGV中断)--为什么?

struct loginInformation
{
    char username[USERNAME_LENGTH];
    char password[PASSWORD_LENGTH];
    int type;
}accounts[NUM_OF_ACCOUNTS];

void createAccountsFromFile()
{
    FILE *input = fopen("accounts.txt", "r");
    int counter;
    for(counter = 0; counter < NUM_OF_ACCOUNTS; counter++)
    {
        fscanf(input, "%s", accounts[counter].username);
        fscanf(input, "%s", accounts[counter].password);
        fscanf(input, "%d", &accounts[counter].type);
    }
}

int main()
{
    createAccountsFromFile();
}

accounts.txt

user1
pass1
0
user2
pass2
1
user3
pass3
2
user4
pass4
3
tuwxkamq

tuwxkamq1#

这意味着程序在退出之前崩溃了。您需要对程序进行调试。例如,需要在fopen之后检查文件是否打开成功。

wlp8pajw

wlp8pajw2#

SIGSEGV并不总是由于内存访问问题的根本原因而引发...
Perl在Unix上抛出139,通常是因为文件I/O。您可能不小心删除了输入文件。

igetnqfo

igetnqfo3#

TL;DR:您的程序试图访问它无权访问的内存位置,所以操作系统终止了它。
第一:代码“139”无关紧要,忘了数字吧。您的程序在“收到SIGSEGV”或有关分段违规的信号后被终止。在这里阅读这意味着什么:
What causes a SIGSEGV
(不要管这个问题是关于C++的,同样的想法。)
那么,为什么会发生这种情况呢?你一定是在做一些你不该做的假设。查看您的代码,它可能是:

  • 从文件中读取一个非常长的字符串,它超出了loginInformation数组的界限--甚至可能超过了分配给程序的整个内存区域的界限。
  • 从无效状态/未初始化/空的文件描述符扫描,如@xuhdev的answer
  • (不太可能/不可能)忽略某个fscanf()调用产生的错误(如果扫描失败,则需要检查errno)。

我想这就够了,尽管我可能遗漏了一些东西。您可以在core dump上使用调试器实际检查发生了什么,而不是猜测:
How do I analyze a program's core dump file with GDB when it has command-line parameters?

pokxtpni

pokxtpni4#

关于Perl编程RC139因“内存不足”而引起的问题。因为一个变量中有太多的数据(百万)。我已经通过定期发布(Undef)这个变量进行了分割。这解决了这个问题。

相关问题