1

ルーターのSIMスイッチングに使用する(ラズベリーのpingコマンドから)失われたパケット数を取得しようとしています。一番下のコードでそれをやろうとしましたが(エラーの原因となる部分に縮小されました)、バッファを解放(pclose)しようとすると、セグメンテーション違反が発生します。私はvalgrindを試しましたが、これを得ました:

0x490FBE0 でのサイズ 4 の無効な読み取り: 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;
}
4

1 に答える 1