fscanf 后关闭时出现分段错误



我尝试丢失数据包编号(来自覆盆子上的ping命令(,用于路由器上的sim切换。我试图用底部的代码来做到这一点(减少到导致错误的部分(,但是当我尝试释放(关闭(缓冲区时,我遇到了分段错误。我试过瓦尔格林德,我得到了这个:

大小 4 的读取无效 在0x490FBE0: fclose@@GLIBC_2.4 (IOFCLOSE.c:53( 地址0x382e3820不是堆叠的、错误的或(最近(释放的 进程以信号 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("%dn", 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;
}

问题是这条线

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

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

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

相关内容

  • 没有找到相关文章

最新更新