【问题标题】:Segmentation fault when pclose after fscanffscanf 后 pclose 时出现分段错误
【发布时间】:2020-03-24 06:18:36
【问题描述】:

我尝试获取丢失的数据包编号(来自覆盆子上的 ping 命令),用于在路由器上进行 sim 切换。我试图用底部的代码来做到这一点(减少到导致错误的部分),但是当我尝试释放(pclose)缓冲区时,我得到了分段错误。我试过 valgrind,我得到了这个:

大小为 4 的读取无效 在 0x490FBE0:fclose@@GLIBC_2.4 (iofclose.c:53) 地址 0x382e3820 没有被堆栈、malloc 或(最近)释放 进程以信号 11 (SIGSEGV) 的默认操作终止 访问不在地址 0x382E3820 的映射区域内

我想我错过了 fscanf 但我不知道如何(我得到 printf 结果,它是正确的 - 4)。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "params.h"
#include <pthread.h> 

void *pingOnly(void *vargp){

    FILE *cmd;
    int packetsReceived=0;
    while(1){
        cmd = popen("sudo ping 8.8.8.8 -c 4 -q","r");
        fscanf(cmd, "%[^,], %d", &packetsReceived);
        printf("%d\n", packetsReceived);
        pclose(cmd);        
        if(packetsReceived<3){
            //testSpeed();
        }
        sleep(300);
    }
    return NULL;    
}

int main( int argc, char *argv[] )
{ 
    pthread_t thread_id[3]; 
    pthread_create(&thread_id[2], NULL, pingOnly, NULL);
    pthread_join(thread_id[2], NULL);
    return 0;
}

【问题讨论】:

    标签: segmentation-fault scanf pclose


    【解决方案1】:

    问题出在这一行

    fscanf(cmd, "%[^,], %d", &packetsReceived);
    

    它试图将一个字符串读入int packetsReceived 并运行到未定义的行为中,破坏堆栈。你可能打算这样做

    fscanf(cmd, "%*[^,], %d", &packetsReceived);
    

    【讨论】:

    • 谢谢,你是对的。我已经检查了该行 10 次,但没有注意到。
    猜你喜欢
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 2017-03-29
    • 2015-02-09
    • 1970-01-01
    相关资源
    最近更新 更多