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

时间:2017-03-19 02:13:06

标签: c unix

所以我认为这只是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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

SIGSEV并不总是导致内存访问问题的根本原因......

Perl通常因为文件I / O而在Unix上抛出139。您可能不小心删除了输入文件。

答案 2 :(得分:-1)

TL; DR:您的程序尝试对没有权限的地方进行内存访问,因此操作系统将其杀死。

第一:代码“139”无关紧要,忘了数字。您的程序在“获取SIGSEGV”或关于分段违规的信号后终止。请阅读这里的含义:

What is SIGSEGV run time error in C++?

(不要紧,这个问题是关于C ++的,同样的想法。)

现在,为什么会发生这种情况?你必须做出一些你不应该做的假设。查看您的代码,可能是:

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

我认为这涵盖了它,虽然我可能错过了一些东西。而不是推测您可以使用core dump上的调试器实际检查发生了什么:

How to analyze a program's core dump file with gdb?